만약 내가한다면:
diff <(cat old) <(cat new)
이것이 diff 프로그램 내에서 내부적으로 작동합니까? Bash 스크립트를 사용하여 동일한 트릭을 어떻게 달성할 수 있습니까?
답변1
직접 시도해 볼 수 있습니다.
echo <(echo) <(echo)
Diff는 두 개의 파일을 읽습니다.
<(...)
이를 bash 스크립트에 대한 인수 로 사용하려면 파일을 "되감기"(또는 다시 열 수 없음)할 수 없다는 점을 기억하십시오. 그래서 한 번 읽으면 사라져요. read
한 줄씩 처리 할 수도 있고 , grep
무엇이든 할 수 있습니다. 여러 번 처리해야 하는 경우 해당 내용을 변수에 저장하세요.
input=$(cat "$1"; printf x) # The "x" keeps the trailing empty lines.
input=${input%x}
또는 임시 파일에 복사하여 반복해서 읽으십시오.
tmp=$(mktemp)
cat "$1" > "$tmp"
답변2
프로그램 에서는 diff
를 입력하는 것과 차이가 없습니다 diff old new
. 이 <(cmd)
연산자는 stdout을 cmd1
fifo로 리디렉션한 다음 fifo를 매개변수로 전달합니다 diff
.
예를 살펴보세요:
user@host:~$ echo <(ls)
/dev/fd/63
/dev/fd/63
는 출력을 포함하는 fifo입니다 ls
. 참조는 cat <(ls)
fifo의 출력을 인쇄하므로 출력이 됩니다 ls
.
따라서 diff
프로그램은 다음과 같이 실행됩니다.
diff /dev/fd/63 /dev/fd/64
두 fifo 모두 cmd의 출력을 포함합니다. diff
파일이기 때문입니다 .