전체 복합 명령에 영향을 미치는 일회성 변수를 설정하는 방법은 무엇입니까?
예를 들어 다음과 같습니다.
FOO=1 ./foo.sh && ./foo.sh
여기 foo.sh
에는 echo "FOO=$FOO"
다음이 인쇄됩니다.
FOO=1
FOO=
전체 파이프라인에 대해 설정하고 싶은 값 FOO
입니다(그러나 현재 셸에서는 설정하거나 내보내고 싶지 않습니다). 서브쉘 작동 방식:
( export FOO=1; ./foo.sh && ./foo.sh )
...하지만 서브쉘이 없는 방법이 있나요?
답변1
서브쉘 방법은 타이핑이 덜한 방법입니다.
(
export FOO="value"
./foo.sh && ./foo.sh
)
또 다른 접근 방식은 하위 쉘을 시작하고 쉘에 대한 환경 변수를 설정하는 것입니다.
FOO="value" sh -c './foo.sh && ./foo.sh'
다른 변형은 다음과 같이 스크립트의 각 호출에 대해 변수를 명시적으로 설정하는 것입니다.
FOO="value" ./foo.sh &&
FOO="value" ./foo.sh
이게 조금 더 편할 수도 있어요
foo=( env FOO="value" ./foo.sh )
"${foo[@]}" && "${foo[@]}"
또는 /bin/sh
,
set -- env FOO="value" ./foo.sh
"$@" && "$@"
또는 호출 스크립트에서 설정한 다음 다음과 같이 완료되면 설정을 해제할 수 있습니다.
export FOO="value"
./foo.sh && ./foo.sh
unset FOO
답변2
당신이 요구하는 것은 해킹 없이는 달성할 수 없는 것입니다. 그 이유는 스크립트를 실행할 때
FOO=1 ./foo.sh && ./foo.sh
기본적으로 시작한 상위 셸의 모든 특성(변수)을 상속하는 두 개의 별도 셸 인스턴스를 시작합니다. $$
의 변수를 인쇄 하면 foo.sh
시작된 각 스크립트에 별도의 proc-id가 있음을 알 수 있습니다.
이제 FOO=1
첫 번째 부분은 첫 번째 프로세스가 시작되는 환경에만 영향을 미칩니다. 변수는아니요상위 셸에서도 실행할 수 있지만 첫 번째 프로세스 범위 내에서만 실행됩니다. 가지다아니요이 변수 세트는 별도의 사용자 공간에서 완전히 실행되는 두 번째 프로세스의 환경에 반영될 수 있습니다.
두 번째 프로세스는 값이 부모로부터 상속되거나(변수가 명시적으로 셸에서 내보내질 때 파이프가 실행됨) 값이 두 번째 프로세스 다시 스크립트에 로컬로 전달되지 않는 한 해당 환경에서 이 값을 볼 수 없습니다.