programing

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

skycolor 2023. 4. 27. 22:07
반응형

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

프로그램이 너무 많다고 말합니다.a그리고.b함께 달릴 수 있는./a그리고../b.

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

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

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

마찬가지로 사용할 수 있습니다.>(command)명령에 연결하려면 다음과 같이 하십시오.

이것은 Bash의 man 페이지에서 "Process Substitution"이라고 불립니다.

두 답변에 모두 추가하여 나란히 비교하려면 다음을 사용합니다.vimdiff:

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

이와 같은 것:

여기에 이미지 설명 입력

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

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

하지만쿠겔만의 해결책이 훨씬 더 깨끗합니다.

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 2 출력(STD_ERR)을 file_descriptor 1 출력(STD_OUT)과 동일한 위치로 전송하는 것을 의미합니다.

이것이 도움이 되었기를 바랍니다.

zsh의 경우, 사용=(command)자동으로 임시 파일을 만들고 대체합니다.=(command)파일 자체의 경로를 사용합니다.일반적인 프로세스 대체를 사용할 경우$(command)명령 출력으로 대체되었습니다.

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

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

Beyond Compare의 경우 다음을 사용해야 합니다.bcomp위와 같은 경우에는bcompare)이후bcomp비교를 시작하고 완료될 때까지 기다립니다.사용하는 경우bcompare비교가 시작되고 명령 출력을 저장하기 위해 만든 임시 파일이 사라지기 때문에 즉시 종료됩니다.

여기서 더 읽기: http://zsh.sourceforge.net/Intro/intro_7.html

또한 다음 사항에 유의하십시오.

셸은 임시 파일을 만들고 명령이 완료되면 해당 파일을 삭제합니다.

은 그고다사차이다니입이의 입니다.$(...)그리고.=(...):

zsh의 man 페이지를 읽으면 <(...)가 =(...)와 유사한 또 다른 프로세스 대체 형태임을 알 수 있습니다.그 둘 사이에는 중요한 차이가 있습니다.<(...)의 경우 셸은 파일 대신 명명된 파이프(FIFO)를 생성합니다.이것은 파일 시스템을 가득 채우지 않기 때문에 더 낫지만 모든 경우에 작동하지는 않습니다.실제로 위의 예에서 =(...)를 <(...)>로 교체했다면 fgrep -f <(...)를 제외하고는 모두 작동을 멈췄을 것입니다.파이프를 편집하거나 메일 폴더로 열 수 없습니다. 그러나 fgrep은 파이프에서 단어 목록을 읽는 데 문제가 없습니다.foo | diff - bar가 작동하기 때문에 diff <(foo) bar가 작동하지 않는 이유는 diff가 인수 중 하나가 -임을 알아차린 후 표준 입력을 임시 파일로 복사하기 때문입니다.

언급URL : https://stackoverflow.com/questions/3800202/diff-output-from-two-programs-without-temporary-files

반응형