쉘이 외부 실행 파일을 명령으로 실행할 때 환경 변수를 실행 파일에 전달할 수 있습니다.
$ var=3 /bin/echo `$var` $ var=3 bash -c "/bin/echo '$var'"
둘 다 아무것도 출력하지 않습니다.
프로그램이 실행될 때
exec
환경 변수도 역할을 하는지 확인하고 싶습니다.$ bash $ unset var; $ var=3 exec /bin/echo '$var' $var $ exec var=3 /bin/echo '$var' bash: exec: var=3: not found
변수 확장을 방지하기 위해 주위에 작은따옴표를 사용합니다 $var
. 방어력은 좀 과한 것 같습니다.
위의 경우 이 환경 변수가 설정되지 않은 이유는 무엇입니까?
실행되는 프로그램에 환경변수를 적용할 수 있나요 exec
?
감사해요.
답변1
매개변수 확장은 마술처럼 발생하지 않으며 이를 수행하려면 쉘이 필요하다는 점을 명심하십시오.
var=3 /bin/echo `$var`
이것으로 무엇을 하려는지 잘 모르겠습니다. 여기서는 역따옴표가 부적절합니다(명령을 실행하고 해당 출력으로 대체됩니다).
var=3 bash -c "/bin/echo '$var'"
인수 확장이 할당 전에 발생하기 때문에 작동하지 않으므로 현재 쉘이 ( 정의되지 않은 것으로 가정) "/bin/echo '$var'"
로 변경되고 하위 쉘이 실행됩니다./bin/echo ''
var
/bin/echo ''
노력하다
var=3 bash -c 'echo $var'
반대로, 여기서 작은따옴표는 현재 쉘의 매개변수를 보호하고 새 쉘이 실행될 때 사용됩니다.
echo $var
그것은 당신이 기대하는 대로 작동합니다.
두 번째 요점에서는 내 원래 의견이 여전히 적용됩니다. 환경을 시험해보고 어떤 일이 일어나는지 확인하려면 env
해당 출력을 실행하고 필터링하세요.
var=3 env | grep var
var=3 exec env | grep var
답변2
모든 문제는 환경이 아니라 참조에 있습니다.
- 명령 환경.
쉘이 외부 실행 파일을 명령으로 실행할 때 환경 변수를 실행 파일에 전달할 수 있습니다.
예, 이는 명령(외부 또는 기타)에 대한 환경 변수를 설정하는 방법입니다.
하지만 이 줄 [a] 에서 무엇을 놓치고 있나요 ?
$ var=3 /bin/echo "$var"
쉘은 인수를 빌드할 때 변수를 확장하는데,
var
명령을 시작한 쉘에 변수가 설정되지 않은 경우 실제로 실행되는 내용은 다음과 같습니다.$ var=3 /bin/echo ""
현재 쉘 확장을 실제로 보려면 다음 명령을 실행하십시오.
$ var=RunningShell ; var=3 /bin/echo "$var" RunningShell
변수 평가를 지연하는 한 가지(일반적으로 안전하지 않은) 방법은 다음과 같습니다.
$ var=3 eval /bin/echo '"$var"' 3
두 번째 예에서는 견적을 교환합니다.
$ var=3 bash -c "/bin/echo '$var'"
아무것도 인쇄하지 않으면 실제 명령줄은 다음과 같습니다.
$ var=3 bash -c "/bin/echo ''"
(설정되지 않은) 변수 $var의 값으로 확장됩니다. 의미하는 바는 다음과 같습니다.
$ var=thisis3 bash -c '/bin/echo "$var"' thisis3
이 경우 작은따옴표는 실행 쉘이 변수를 확장하는 것을 방지하고 확장은 실행 쉘(
bash -c
)로 남겨둡니다.실제로 환경을 보려면 env를 사용하십시오.
- 프로그램이 exec에 의해 실행될 때 환경 변수도 역할을 하는지 확인하고 싶습니다.
실행 중인 쉘이 닫히므로 현재 쉘에서 실행하지 마십시오.
실행 중인 셸이 닫히는 것을 방지하려면 다음과 같이 하세요.$ var=3 exec /bin/echo \$var | cat $var
닫는 쉘은 어차피 닫힐 쉘, 즉 파이프의 첫 번째 서브쉘이 되기 때문입니다.
그러나 이는 환경의 var 값을 표시하지 않습니다. 환경의 변수를 보려면 view 환경 명령을 사용하십시오.
$ var=3 env | grep var var=3
- 명령 환경.
[a]
작성한 명령에는 역따옴표가 있습니다 `
. 이를 작은따옴표로 변경하면 변수 확장 및 인쇄가 방지됩니다 $var
.:
$ var=3 /bin/echo '$var'
$var