다음과 같은 일련의 명령이 있습니다.
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