서브쉘 및 cd 명령을 사용한 stdin/stdout의 동작

서브쉘 및 cd 명령을 사용한 stdin/stdout의 동작

다음과 같은 일련의 명령이 있습니다.

cd / && ls | ( cd /tmp && cat >dumpfile)

이 일련의 명령은 다음을 수행합니다. /tmp/dumpfile이 파일에는 루트 디렉터리 목록이 포함되어 있습니다.

출력은 cd / && ls서브셸로 파이프됩니다. 내가 찾은 것이상한서브셸에서는 출력을 cd /tmp삼키는 대신 ls나중에 cat >dumpfile가져와서 파일에 씁니다. 여기서 무슨 일이 일어나고 있는 걸까요?

답변1

ls파이프는 서브셸에서 시작 하도록 표준 출력을 설정합니다 .

서브셸에서는 동일한 프로세스로 수행됩니다 cd /tmp.cat

cd /tmp표준 입력(파이프)에서 읽지 않으므로 cat표준 입력에서 읽을 때 모든 출력을 얻습니다 ls.

답변2

cd원하지 않기 때문에 출력을 삼키지 않습니다. 생각해 보세요:

{ ls; date; } | (cd /tmp && date >> date.txt && cat date.txt && cat >dumpfile)

다른 명령 중 어느 것도 이를 사용하려고 하지 않으므로 마지막 명령만 파이프에서 명령을 cat >dumpfile저장합니다 .stdin

관련 정보