다음과 같은 환경 변수를 사용하여 명령을 실행할 수 있다는 것을 알고 있습니다.
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
요약(현재 삭제됨) 참고: 환경 변수(셸 변수가 아님)를 생성 해야 합니다 . 환경 변수의 문제점은 하위 프로세스에 의해 상속된다는 것입니다. first
및 second
해당 환경을 보는 외부 유틸리티(또는 스크립트)인 경우 , 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