파이프와 입력 스트림이 동일한 명령으로 리디렉션됩니다. 명령은 어떤 입력을 사용합니까?

파이프와 입력 스트림이 동일한 명령으로 리디렉션됩니다. 명령은 어떤 입력을 사용합니까?

아래 명령을 실행하려고합니다.

cat numbers.txt | sort < words.txt

위 명령에는 sort 명령의 입력 스트림을 공급하는 cat 명령의 파이프가 있습니다. 그러나 동시에 sort 명령의 입력 스트림도 word.txt 파일로 리디렉션됩니다. 명령을 실행했을 때, word.txt의 데이터가 sort 명령에 의해 정렬되어 터미널에 다시 표시되는 것을 발견했습니다.

이 경우 쉘이 파이프와 리디렉션을 어떻게 처리하는지 이해하지 못합니다. 명령이 서로 다른 두 소스의 입력 스트림을 허용할 수 있는지 여부입니다. 내부적으로 어떻게 작동하는지에 대한 내 생각은 리디렉션과 파이프가 명령을 따라 왼쪽에서 오른쪽으로 처리되므로 cat 명령의 출력 스트림이 먼저 sort 명령의 입력 스트림으로 사용된다는 것입니다. 그러나 sort 명령은 이 파이프 다음에 또 다른 입력 스트림 리디렉션을 제공하므로 sort 명령의 입력 스트림은 word.txt에 연결됩니다. 따라서 Words.txt의 데이터는 명령이 실행될 때만 sort 명령에 도달합니다.

또한 다음 명령이 실행되지 않는 이유도 있습니다. 추가 리디렉션을 통해 재정의를 통해 리디렉션을 변경했습니다.

cat numbers.txt | sort << words.txt

하나 있다질문부분은 이와 유사하지만 쉘이 파이프와 리디렉션을 어떻게 처리하는지 잘 이해할 수 없습니다.

답변1

리디렉션은 왼쪽에서 오른쪽으로 처리됩니다.Bash에서 파이프 다음(실제로는모든 POSIX 쉘). 존재하다

cat numbers.txt | sort < words.txt

쉘은 먼저 sort(미래의) 표준 입력을 그것이 나오는 파이프로 설정한 다음 cat처리할 때 < words.txt읽도록 변경합니다 words.txt.

<<구분 기호를 시작합니다.

cat numbers.txt | sort << words.txt

"words.txt"(명령에 지정된 입력 종료 태그이기 때문에)가 표시될 때까지 기다립니다. 보다쉘의 제어 및 리디렉션 연산자는 무엇입니까?

답변2

명령이 서로 다른 두 소스의 입력 스트림을 허용할 수 있는지 여부입니다.

아니요. 입력 스트림은 실제로 다른 사람이 전달한 파일 설명자일 뿐입니다. 파일 내에 파일이 하나만 있는 것처럼 여러 스트림을 병합할 수 없습니다.

cat numbers.txt | sort < words.txt

BTW는 catcon enate의 약자입니다 cat. 말 그대로 명령줄에 지정된 모든 파일을 출력 스트림에 연결하는 것입니다.

cat numbers.txt words.txt | sort 

일하다. 물론 sort여러 파일 자체를 정렬할 수도 있으므로 sort numbers.txt words.txt효과는 동일합니다.

하지만 질문은 좀 더 일반적인 것 같습니다.
여러 개의 파일과 스트림이 있는 경우 이를 어떻게 하나의 출력으로 연결합니까?

글쎄요, 최신 쉘은 원하는 작업을 수행합니다(적어도 bash 및 zsh는 수행합니다).

cat file1 <(some program that generates output) <(echo "foo bar") file2 | sort

이러한 쉘에는 <(…)"입력 파일 이름으로 전달된 임시 파이프를 생성"하는 기능이 있습니다. 물론 매우 간단한 서브쉘 방법도 있습니다:

( cat file1; some program that generates output; echo "foo bar"; cat file2 ) | sort

같은 효과가 있습니다. (거기실행 병렬성의 차이; cat <(sleep 2; echo hello) <(sleep 2; echo world)실행하는 데 총 2초가 소요됩니다 (sleep 2; echo hello; sleep 2; echo world). )

관련 정보