임시 파일이없는 두 프로그램의 Diff 출력


답변:


211

<(command)한 명령의 출력을 마치 파일 이름 인 것처럼 다른 프로그램에 전달하는 데 사용하십시오 . Bash는 프로그램의 출력을 파이프로 파이프하고 /dev/fd/63외부 명령 과 같은 파일 이름을 전달합니다 .

diff <(./a) <(./b)

마찬가지로 당신이 사용할 수있는 >(command)당신이 파이프 뭔가 원하는 경우 명령.

이것을 Bash 매뉴얼 페이지에서 "프로세스 대체"라고합니다.


1
알아야 할 한 가지 단점은 ./a 또는 ./b가 실패하면 호출자가이를 알 수 없다는 것입니다.
Alexander Pogrebnyak

5
OP는 질문 bash에 태그를 지정했지만 레코드의 경우 다른 쉘에서는 작동하지 않습니다. Posix 유틸리티 표준에 대한 bash 확장입니다.
DigitalRoss

5
Java 프로그램 으로이 솔루션을 시도하고 다음 오류가 발생했습니다 -bash: syntax error near unexpected token ('. 나는 괄호없이 다시 시도하고 얻었다 -bash: java: No such file or directory. 명령에 매개 변수가 있으면 작동하지 않습니까?
styfle

1
@DigitalRoss-별명을 사용하여 솔루션을 다른 쉘로 확장 할 수 있습니다. tcsh에서는 다음과 같은 추한 동작이 작동합니다 alias diffcmd bash -c \'diff \<\(sh -c \!:1\) \<\( sh -c \!:2 \)\'. (예를 들어, diffcmd "ls" "ls -a").
Paul Lynch

Google 외부에서 방황하는 사람은 zsh에서도 작동합니다. (또한 호출하는 항목에 입력을 공급해야하는 경우 fseekzsh는 =(./a)동일하게 사용할 수 <(./a)있지만 후드 아래에서 임시 파일을 사용하여 zsh가 삭제합니다.)
ssokolow

26

나란히 비교하고 싶다면 두 대답에 모두 추가하십시오 vimdiff.

vimdiff <(./a) <(./b)

이 같은:

여기에 이미지 설명을 입력하십시오


vimdiff아름답고 똑똑하며 대화식 차이 비교보기를 만듭니다. vim대부분의 시스템 에서 패키지 와 함께 제공되는 것 같습니다 .
Tim Visée

vimdiff또한 다른 줄뿐만 아니라 다른 특정 텍스트 조각도 보여줍니다.
Anton Tarasenko


15

궁금한 사람은 Fish Shell 을 사용하여 프로세스 대체를 수행하는 방법입니다 .

세게 때리다:

diff <(./a) <(./b)

물고기:

diff (./a | psub) (./b | psub)

불행히도 어류의 이행은 현재 부족하다 . 물고기는 디스크에서 정지되거나 임시 파일을 사용합니다. 또한 명령의 출력에 psub를 사용할 수 없습니다.


이것은 현재 물고기에서 제대로 작동하지 않습니다. 프로그램 출력이 BUFSIZ보다 큰 경우 명령이 정지됩니다. (또는 물고기는 실제로 디스크에 임시 파일을 사용합니다)
Evan Benn

7

이미 좋은 답변에 조금 더 추가하면 도움이되었습니다.

이 명령 docker은 도움말을 출력합니다 STD_ERR(예 : 파일 설명자 2).

나는 있는지 확인하기 위해 원 docker attachdocker attach --help동일한 출력을 준

$ docker attach

$ docker attach --help

이 두 명령을 입력 한 후 다음을 수행했습니다.

$ diff <(!-2 2>&1) <(!! 2>&1)

!! ! -1과 동일합니다. 즉,이 명령보다 먼저 명령 1을 실행합니다. 마지막 명령

! -2는이 명령보다 먼저 명령을 실행하는 것을 의미합니다.

2> & 1은 file_descriptor 1 출력 (STD_OUT)과 동일한 위치에 file_descriptor 2 출력 (STD_ERR)을 전송 함을 의미합니다.

이것이 약간 사용되기를 바랍니다.


0

zsh의 경우를 사용하면 =(command)자동으로 임시 파일이 작성 =(command)되고 파일 자체의 경로로 대체 됩니다. 정상적인 프로세스 $(command)대체에서는 출력으로 대체됩니다. 에서는 명령 으로 .

이 zsh 기능은 매우 유용하며 Diff 도구를 사용하여 두 명령의 출력을 비교하는 데 사용할 수 있습니다 (예 : Beyond Compare).

bcomp  =(ulimit -Sa | sort) =(ulimit -Ha | sort)

Beyond Compare의 경우, 비교를 시작하고 완료 되기를 기다리 므로 bcomp위 대신 (대신 bcompare)에 사용해야합니다 . 를 사용하면 비교가 시작되고 명령 출력을 저장하기 위해 생성 된 임시 파일이 사라 지므로 즉시 종료됩니다.bcompbcompare

자세한 내용은 여기를 참조하십시오 : http://zsh.sourceforge.net/Intro/intro_7.html

또한 이것을 주목하십시오 :

쉘은 임시 파일을 작성하고 명령이 완료되면이를 삭제합니다.

다음과의 차이점은 다음 $(...)=(...)같습니다.

zsh의 매뉴얼 페이지를 읽으면 <(...)이 = (...)와 비슷한 다른 형식의 프로세스 대체임을 알 수 있습니다. 둘 사이에는 중요한 차이점이 있습니다. <(...)의 경우, 쉘은 파일 대신 명명 된 파이프 (FIFO)를 작성합니다. 파일 시스템을 채우지 않기 때문에 더 좋습니다. 그러나 모든 경우에 작동하지는 않습니다. 실제로 위의 예에서 = (...)을 <(...)으로 바꾸었다면 fgrep -f <(...)를 제외하고 모두 작동을 멈췄을 것입니다. 파이프를 편집하거나 메일 폴더로 열 수 없습니다. 그러나 fgrep은 파이프에서 단어 목록을 읽는 데 아무런 문제가 없습니다. foo | 이후 diff <(foo) 막대가 작동하지 않는 이유가 궁금 할 수 있습니다. diff-바 작동; diff가 인수 중 하나가-인 것을 발견하면 임시 파일을 작성하고 표준 입력을 임시 파일에 복사하기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.