사용하는 것의 차이점 :
eval "echo "foo""
그리고
echo "echo "foo"" | bash
있습니까?
댓글
답변
짧은 답변
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
명령은 파이프 관련 여부에 관계없이 서브 쉘에서 입력을 실행합니다. 자세한 내용은 내 솔루션 업데이트를 참조하십시오.
( eval 'echo "foo"' )