Bash에서 예기치 않은 동작


7

보낸 사람 man bash:

간단한 명령은 일련의 선택적 변수 할당입니다
공백으로 구분 된 단어와 방향 전환이 뒤 따릅니다.
제어 운영자에 의해 종료되었습니다. 첫 단어는
실행할 명령이며 인수 0으로 전달됩니다. 그만큼
나머지 단어는 호출 된 명령에 인수로 전달됩니다.

따라서 다음과 같이 작성하는 것이 합법적입니다.

foo=bar echo $foo

그러나 예상대로 작동하지 않습니다 (개행 문자 만 인쇄). 이후 나에게는 꽤 이상합니다.

$ foo=bar printenv
foo=bar
TERM=rxvt-unicode
[...]

누군가 내가 잘못하고있는 부분을 설명해 주시겠습니까?

답변:


6

이것은 명령이 실행되기 전에 변수 확장이 수행되기 때문에 발생합니다. 변수 확장이 발생하면 foo설정되지 않으므로 빈 문자열로 확장됩니다. 그런 다음 명령이 실행되어 설정합니다 foo.


1
또한 foo는 echo 명령의 접두사로 설정되므로 해당 명령에 대해서만 설정되며 후속 명령에는 설정되지 않습니다. 와 비교 foo=bar eval 'echo eval sees $foo'; echo echo sees $foo(여기 이후 $foo내에서 확장 eval명령 값이 됩니다 하지만 다음 에코 명령, 대체).
Gordon Davisson

1
이것은 아동의 환경 (예 echo를 들어, 원래 질문이나 evalGordon의 예)에서 과제입니다 . 자녀 환경의 변수 할당은 부모 환경의 변수 값에 영향을 미치지 않습니다. foo=bar eval 'foo=$foo'; echo $foo줄 바꿈 만 출력합니다.
Dennis Williamson

From man bash: "명령 이름이 없으면 변수 지정이 현재 쉘 환경에 영향을줍니다. 그렇지 않으면 변수가 실행 된 명령의 환경에 추가되고 현재 쉘 환경에 영향을 미치지 않습니다. 지정 중 하나가 값을 지정하려고하면 "읽기 전용 변수에 오류가 발생하고 명령이 0이 아닌 상태로 종료됩니다."
Dennis Williamson

1

당신이 수행하는 경우 foo=barecho $foo한 줄에, 그것은 작동하지 않습니다. 세 가지 중 하나를 수행해야합니다.

  1. 별도의 명령으로 실행하십시오. 즉 :foo=bar Enter echo $foo

  2. 한 줄로 실행하지만 두 줄 사이에 세미콜론을 사용하십시오. 즉 :foo=bar; echo $foo

  3. # 2와 동일하지만 이중 앰퍼샌드가 있습니다. 즉 :foo=bar && echo $foo

2와 3의 차이점은 성공한 echo $foo경우 에만 3이 실행된다는 것 foo=bar입니다.


고맙지 만 문제를 해결하는 방법을 알고 있습니다. 내가 제공 한 예제에만 관심이있었습니다.
cYrus

+1 : 멋진 대안이 있습니다. 이것은 누군가에게 유용 할 수 있습니다.
cYrus


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.