[bash] 임시 파일이없는 두 프로그램의 Diff 출력
내가 너무 프로그램이 말 a
과 b
내가 함께 실행할 수 ./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 attach
과 docker 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
)에 사용해야합니다 . 를 사용하면 비교가 시작되고 명령 출력을 저장하기 위해 생성 된 임시 파일이 사라 지므로 즉시 종료됩니다.bcomp
bcompare
자세한 내용은 여기를 참조하십시오 : http://zsh.sourceforge.net/Intro/intro_7.html
또한 이것을 주목하십시오 :
쉘은 임시 파일을 작성하고 명령이 완료되면이를 삭제합니다.
다음과의 차이점은 다음 $(...)
과 =(...)
같습니다.
zsh의 매뉴얼 페이지를 읽으면 <(…)이 = (…)와 비슷한 다른 형식의 프로세스 대체임을 알 수 있습니다. 둘 사이에는 중요한 차이점이 있습니다. <(…)의 경우, 쉘은 파일 대신 명명 된 파이프 (FIFO)를 작성합니다. 파일 시스템을 채우지 않기 때문에 더 좋습니다. 그러나 모든 경우에 작동하지는 않습니다. 실제로 위의 예에서 = (…)을 <(…)으로 바꾸었다면 fgrep -f <(…)를 제외하고 모두 작동을 멈췄을 것입니다. 파이프를 편집하거나 메일 폴더로 열 수 없습니다. 그러나 fgrep은 파이프에서 단어 목록을 읽는 데 아무런 문제가 없습니다. foo | 이후 diff <(foo) 막대가 작동하지 않는 이유가 궁금 할 수 있습니다. diff-바 작동; diff가 인수 중 하나가-인 것을 발견하면 임시 파일을 작성하고 표준 입력을 임시 파일에 복사하기 때문입니다.