짧은 답변

짧은 답변

다음을 사용하여 차이점은 무엇입니까?

eval 'echo "foo"'

그리고

echo 'echo "foo"' | bash

당신은 있나요?

답변1

짧은 답변

실행하는 명령은 eval현재 셸에서 실행되고 파이프로 연결된 명령은 bash하위 셸에서 실행됩니다. 예를 들면 다음과 같습니다.

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

> eval 'x=42'; echo $x
42

더 긴 답변

댓글에서 누군가 최신 버전 bash(>=4.2)에서는 첫 번째 명령도 동일한 효과를 가질 수 있다고 주장했습니다. 그러나 이는 사실이 아닌 것 같습니다.

실제로 파이프된 명령이 현재 세션에서 실행되지 않게 할 수 있는 몇 가지 요소(파이프 및 명령)가 있습니다 bash.

대부분의 경우 파이프 명령은 하위 쉘에서 실행됩니다. 배쉬 매뉴얼(섹션 3.2.2: 파이프라인)에는 다음과 같은 설명이 있습니다.

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

주석에서 지적했듯이 lastpipe이 동작은 옵션을 통해 수정할 수 있습니다. 배쉬 매뉴얼(섹션 4.3.2: 내장 상점)에는 이 옵션에 대해 다음과 같은 설명이 있습니다 lastpipe.

마지막 관

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

이러한 경우인지는 다음과 같이 확인할 수 있습니다.

먼저 활성화하십시오 lastpipe.

> shopt -s lastpipe

그런 다음 작업 제어를 비활성화합니다.

> set +m

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

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

명령이 stdin에서 입력을 읽을 수 없기 때문에(따라서 파이프에서 입력을 얻을 수 없기 때문에) 해결 방법으로 while루프와 명령을 사용합니다 .readeval

이 예에서는 파이프라인의 가장 오른쪽 명령이 실제로 현재 셸에서 실행될 수 있음을 보여줍니다. 그러나 이는 실제로 원래 예제에 영향을 미치지 않습니다. 작업 제어를 활성화 및 비활성화 한 경우에도 lastpipe다음으로 파이프할 때 여전히 다음 결과를 얻습니다 bash.

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

>

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

관련 정보