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

내가 너무 프로그램이 말 ab내가 함께 실행할 수 ./a./b.

임시 파일에 먼저 쓰지 않고 출력을 비교할 수 있습니까?



답변

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

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

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

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


답변

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

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

이 같은:

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


답변

한 가지 옵션은 명명 된 파이프 (FIFO) 를 사용하는 것입니다 .

mkfifo a_fifo b_fifo
./a > a_fifo &
./b > b_fifo &
diff a_fifo b_fifo

…하지만 John Kugelman의 솔루션 은 훨씬 깨끗합니다.


답변

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

세게 때리다:

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

물고기:

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

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


답변

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

이 명령 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)을 전송 함을 의미합니다.

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


답변

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가 인수 중 하나가-인 것을 발견하면 임시 파일을 작성하고 표준 입력을 임시 파일에 복사하기 때문입니다.


답변