파이프라인에 문제가 있습니다.

파이프라인에 문제가 있습니다.

왜 나는 이런 일을 할 수 없습니까?

tail -n 5 small.txt | diff small.txt

첫 번째 명령의 실행 결과를 독립적인 입력이 아닌 두 번째 명령의 두 번째 매개변수로 전달하고 싶습니다. 어떻게 해야 합니까?

답변1

이 시도...

  diff small.txt <(tail -n 5 small.txt)

답변2

노력하다 tail -n 5 small.txt | diff small.txt -.

에서 man diff:

FILE이 "-"이면 표준 입력을 읽습니다.

-방법은 원하는 작업을 올바르게 수행하는 방법을 보여줍니다. 그러나 다음 방법은 몇 가지를 가르쳐 주고 (쉘) 생활을 더 쉽게 만들어 줄 것입니다.

diff small.txt <(tail -n 5 small.txt)

답변3

제안한 방식으로 파이프를 작성할 수 없는 이유는 diff유틸리티가 명령줄에 두 개의 입력 파일을 요구하고 tail기본적으로 표준 입력 스트림(출력)에서 읽지 않기 때문입니다.

두 번째 "파일" 인수(또는 파일을 비교하려는 순서에 따라 첫 번째 인수)를 추가하여 표준 입력에서 읽는 것을 나타낼 수 있습니다 diff.-

tail -n 5 small.txt | diff small.txt -

diff-파일 이름이 감지되어 tail두 번째 파일 대신 명령에서 읽혀집니다. 이는 일부 유틸리티(예: diff, cat, 등) 에 의해 구현된 의미 체계이지만 보편적이지 않습니다(셸은 "표준 입력과 동일"을 paste알지 못함 ).-

bash기타 지원되는 쉘프로세스 교체를 사용하면 <( ... )특정 명령의 출력이 포함된 임시 파일(또는 FIFO)을 생성하도록 셸에 지시할 수 있습니다.

diff small.txt <( tail -n 5 small.txt )

이것은본질적으로(그러나 기술적으로는 그렇지 않음)

tail -n 5 small.txt >tmpfile
diff small.txt tmpfile
rm -f tmpfile

관련 정보