eval vs. pipe through bash (한국어)

사용하는 것의 차이점 :

eval "echo "foo"" 

그리고

echo "echo "foo"" | bash 

있습니까?

댓글

  • 여기 ' 실행 환경에 대해 약간 다른 동작을 가진 또 다른 변형 : ( eval 'echo "foo"' )

답변

짧은 답변

eval에 의해 실행되는 명령은 현재 셸에서 실행되고 bash에 파이프 된 명령은 다음과 같은 하위 셸에서 실행됩니다. / p>

> echo "x=42" | bash; echo $x > eval "x=42"; echo $x 42 

긴 답변

댓글에서 bash (> = 4.2) 첫 번째 명령도 동일한 효과를 가질 수 있습니다. 그러나 이것은 사실이 아닌 것 같습니다.

실제로 파이프 명령이 현재 세션에서 실행되지 않도록하는 몇 가지 요인이 있습니다. 파이프 및 bash 명령.

대부분 파이프 명령은 서브 쉘에서 실행됩니다. Bash 매뉴얼 ( 섹션 3.2.2 : 파이프 라인 )에는 다음과 같은 내용이 있습니다.

파이프 라인의 각 명령은 자체 서브 쉘에서 실행됩니다 ( 명령 실행 환경 참조).

댓글에서 지적했듯이이 동작은 lastpipe 옵션을 통해 수정할 수 있습니다. Bash 매뉴얼 ( 섹션 4.3.2 : Shopt Builtin )에는 lastpipe 옵션에 대해 다음과 같은 내용이 있습니다.

lastpipe

설정되고 작업 제어가 활성화되지 않은 경우 셸은 다음에서 실행되지 않은 파이프 라인의 마지막 명령을 실행합니다. 현재 셸 환경의 배경입니다.

다음과 같은 경우인지 확인할 수 있습니다.

먼저 활성화 lastpipe :

> shopt -s lastpipe 

그런 다음 작업 제어 비활성화 :

> set +m 

이제 파이프 내에서 변수를 설정하는 명령을 실행합니다.

> unset x > echo x=42 | while IFS= read -r line; do eval "${line}"; done; > echo $x 42 

while 루프 및 read 명령은 eval 명령이 stdin에서 입력을 읽을 수 없기 때문에 (따라서 파이프).

이 예는 파이프의 맨 오른쪽 명령이 실제로 , 현재 쉘에서 실행됩니다. 그러나 이것은 실제로 원래 예제에 영향을 미치지 않습니다. lastpipe를 활성화하고 작업 제어를 비활성화 한 경우에도 bash에 파이핑 할 때 다음과 같은 결과가 나타납니다.

> echo "x=42" | bash; echo $x > 

bash 명령 자체가 서브 쉘에서 입력을 실행하기 때문입니다.

코멘트

  • 좋은 관찰입니다. ' 그것을 깨닫지 못했지만, 맞습니다. ' 파이프 작동 방식
  • 궁금한 점이 있습니다. 답변을 수락하지 않은 이유는 무엇입니까?
  • 스크립트를 실행할 때 bash 4.2 이상인 경우 (또는 jobcontrol이 꺼져있을 때 더 정확하게) shopt lastpipe가 설정되고 파이프 라인이 배경 화되지 않은 경우 ' 상단 ' 쉘은 서브 쉘이 아닙니다. unix.stackexchange.com/questions/9954/ … unix.stackexchange.com/questions/136206/readarray-or-pipe-issue
  • @ dave_thompson_085 bash 명령은 다음 위치에서 실행할 수 있습니다. 상단 쉘은 옵션에 따라 다르지만 x=42는 합리적으로 서브 쉘이라고 할 수있는 무언가에서 실행됩니다.
  • @AlexanderMills 실제로 파이프는 ' 유일한 문제가 아닙니다. bash 명령은 파이프 관련 여부에 관계없이 서브 쉘에서 입력을 실행합니다. 자세한 내용은 내 솔루션 업데이트를 참조하십시오.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다