diff <(cat old) <(cat new)를 실행할 때 어떤 fd가 사용됩니까?

diff <(cat old) <(cat new)를 실행할 때 어떤 fd가 사용됩니까?

만약 내가한다면:

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을 cmd1fifo로 리디렉션한 다음 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파일이기 때문입니다 .

관련 정보