왜 나는 이런 일을 할 수 없습니까?
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