파일을 비교하여 명령에서 출력하는 방법은 무엇입니까?


32

일반적으로 다음과 같이 작성합니다.

diff file1 file2

그러나 파일을 비교하고 명령에서 출력하고 싶습니다 (여기서는 명령을 사소한 것으로 만듭니다).

diff file1 <(cat file2 | sort)

좋아, 이것은 쉘 프롬프트에서 수동으로 입력 할 때 작동하지만 쉘 스크립트에 정확히 동일한 줄을 넣은 다음 스크립트를 실행하면 오류가 발생합니다.

그래서 문제는-이것을 올바르게하는 방법은 무엇입니까?

물론 출력을 임시 파일에 쓰는 것을 피하고 싶습니다.

답변:


39

스크립트와 쉘이 다르다고 생각합니다. 아마도 #!/bin/sh스크립트 상단에 통역사가 있지만 bash개인 쉘로 사용 하고있을 것입니다. 을 실행하여 터미널에서 어떤 쉘을 실행하는지 확인할 수 있습니다 echo $SHELL.

대부분의 쉘에서 작동하는 더 쉬운 방법은 파일 읽기 연산자 대신 파이프 경로 재 지정을 사용하는 것입니다. '-'기호는 STDIN을 읽기위한 표준 명명법이며 인수 목록에서 파일 이름을 대체 할 때 자주 사용할 수 있습니다.

cat file2 | sort | diff file1 -

또는 쓸모없는 고양이 사용 을 피하려면 :

sort < file2 | diff file1 -

아, 당신은 참 좋습니다, sh가 bash인지 아닌지는 확인하지 않았습니다. 솔루션 주셔서 대단히 감사합니다.
greenoldman

stdout으로 파일을 비교하는 중입니다. 이제 stdout을 파일과 어떻게 다른지? 반대 방향입니다. 그것은 사용 -R하는 경우git diff --no-index
Nakilon

@Nakilon 인수 순서를 변경하면됩니다 : diff - file1.
Caleb

시원한. 이것은 효과가 없었습니다 git diff.
킬론

@Nakilon 물론 아닙니다. 왜 그런가요? git diff완전히 다른 짐승이며 파일이 아닌 내부 색인의 glob 객체에 대한 참조에서 작동합니다. diff파일 시스템에서 작동합니다. -구문은 단지에 대한 문법 설탕 쉘되는 /dev/stdin표준 입력 스트림을 나타내는 파일을. 따라서 왜 diff파일 이름 대신 사용할 수 있습니다. 한편 git diff파일을 찾는 것이 아니라 객체를 찾는 것이므로 인식하는 것으로 전달해야합니다. 파일을 서로 비교하는 데 사용하지 마십시오 diff.
Caleb

-4

표준 입력의 범위는 스크립트 자체이므로 다음과 같이 코드를 블록 안에 넣습니다.

{
  diff file1 <(sort file2)
}

이러한 방식으로 STDIN의 범위는 블록 내부에 있습니다.

시도했지만 작동합니다.


그것은 기능이 아니며, 블록이며, 아무런 차이가 없습니다.
Gilles 'SO- 악마 그만해'

정정을위한 @gilles Thx. BTW 나는 나 자신을 시험해 보았고 효과가있다. 당신은?
tmow

3
블록은 <(…)구성 의 유효성에 영향을 미치지 않습니다 . 지원하는 쉘에서 스크립트를 실행할지 여부에 따라 스크립트가 작동하거나 작동 <(…)하지 않습니다 (ksh93 / bash / zsh vs Bourne / ash / kshk88). 케일럽의 대답이 그 모든 것을 못 박았습니다.
Gilles 'SO- 악의를 그만두십시오'

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