서브셸에 대한 환경 변수 설정

서브셸에 대한 환경 변수 설정

다음과 같은 환경 변수를 사용하여 명령을 실행할 수 있다는 것을 알고 있습니다.

FOO=bar mycommand

다음과 같이 서브셸에서 명령을 실행할 수 있다는 것을 알고 있습니다.

(firstcommand && secondcommand)

하지만 어떻게든 이 둘을 결합할 수 있을까요?

FOO=bar (firstcommand && secondcommand)

다음을 제공합니다:

sh: syntax error: unexpected "("

최소한 비지박스 쉘(ash)에서는요.

편집하다:Kusarananda는 FOO=bar sh -c 'first && second'이것이 실제로 해결책이라고 제안합니다. 그러나 나는 따옴표 이스케이프를 조작할 필요가 없기 때문에 서브셸 구문을 좋아하기 때문에 대체 답변에도 관심이 있습니다.

답변1

일방 통행:

FOO=bar sh -c 'first && second'

이는 FOO개별 명령에 대한 sh환경 변수를 설정합니다 .

여러 환경 변수를 설정합니다.

FOO=bar BAZ=quux sh -c 'first && second'

export또 다른 방법은 서브쉘 내부에 변수를 생성하는 것입니다. 서브셸 내부에서 작업을 수행하면 export셸이 해당 환경에서 변수를 얻지 못하게 됩니다.

( export FOO=bar; first && second )

export요약(현재 삭제됨) 참고: 환경 변수(셸 변수가 아님)를 생성 해야 합니다 . 환경 변수의 문제점은 하위 프로세스에 의해 상속된다는 것입니다. firstsecond해당 환경을 보는 외부 유틸리티(또는 스크립트)인 경우 , FOO없으면 export.

답변2

연산자를 사용하여 &&하위 쉘 선언을 환경 변수 할당 문에 연결합니다.

FOO=bar && (firstcommand && secondcommand)

예를 들어:

GREETING='Hello' && ( echo "${GREETING}, friend!" )
# Hello, friend!

&&또한 명령이 사용되는 관련 문제를 극복합니다.이전에변수의 값(변수가 명령의 접두어로 새 값을 사용하여 재정의된 경우):

GREETING='Halt'
GREETING='Hello' && echo "${GREETING}, friend!"
# Hello, friend!

아니요 &&:

GREETING='Halt'
GREETING='Hello' echo "${GREETING}, friend!"
# Halt, friend!
# OOPS!

답변3

선언을 서브셸에 넣을 수 있습니다.

( export FOO=bar; firstcommand && secondcommand )

또는 POSIXly,

( export FOO; FOO=bar; firstcommand && secondcommand )

답변4

일반 내보내기의 경우 상단 makefile에 이 줄을 추가하세요.

SHELL:=NODE_PATH=. ${SHELL}

여기서 "NODE_PATH=". var의 예입니다

이 예제 프로젝트에서는 이를 사용하고 있습니다.

https://github.com/rzr/webthing-iotjs/blob/sandbox/rzr/node/master/Makefile#L24

관련 정보