이 환경 변수가 설정되지 않은 이유는 무엇입니까?

이 환경 변수가 설정되지 않은 이유는 무엇입니까?
  1. 쉘이 외부 실행 파일을 명령으로 실행할 때 환경 변수를 실행 파일에 전달할 수 있습니다.

    $ var=3 /bin/echo `$var`
    
    $ var=3 bash -c "/bin/echo '$var'"
    

    둘 다 아무것도 출력하지 않습니다.

  2. 프로그램이 실행될 때 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

  • 모든 문제는 환경이 아니라 참조에 있습니다.

    1. 명령 환경.

      쉘이 외부 실행 파일을 명령으로 실행할 때 환경 변수를 실행 파일에 전달할 수 있습니다.

    예, 이는 명령(외부 또는 기타)에 대한 환경 변수를 설정하는 방법입니다.

    하지만 이 줄 [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를 사용하십시오.

      1. 프로그램이 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

관련 정보