2011-01-19 5 views
11

두 파일에서 작동하도록 설계된 여러 가지 유닉스 명령이 있습니다. 일반적으로 이러한 명령을 사용하면 "파일"중 하나의 내용을 파일 이름 대신 단일 대시를 사용하여 표준 입력에서 읽을 수 있습니다.두 파일을 표준 입력으로 리디렉션

난 그냥 두 파일은 표준 입력에서 읽을 수 있도록 보인다 a technique 건너 온 :.

내 초기 믿지 반응이었다
comm -12 <(sort file1) <(sort file2) 

, "작동 안 표준 입력의 연결이 단지 것 명령은 파일을 구분할 수 없으며 심지어 두 파일의 내용이 제공되었음을 알 수 없습니다. "

물론이 구성이 작동합니다. 나는 cygwin 1.7.7에서 bash 3.2.51을 사용하여 commdiff으로 테스트했습니다. 어떻게 작동하는지 궁금 하군요.

  • 왜 작동하나요?
  • Bash 확장 기능입니까, 아니면 Bourne 쉘 기능입니까?
  • 내 시스템에서 작동하지만이 기술은 다른 플랫폼에서 작동합니까? (즉,이 기술을 사용하여 작성된 스크립트는 이식 가능합니까?)

답변

9

배쉬, Korn 셸 및 Z 모두 지원 process substitution 쉘. 유틸리티에 대한 파일로 나타납니다. 이것을 시도하십시오 :

$ bash -c 'echo <(echo)' 
/dev/fd/63 
$ ksh -c 'echo <(echo)' 
/dev/fd/4 
$ zsh -c 'echo <(echo)' 
/proc/self/fd/12 

표시되는 것과 유사한 파일 설명자가 나타납니다.

+0

그게 - 프로세스 대체입니다! 리다이렉션에 대한 정보를 얻기 위해 인터넷 검색을 많이했으나 잘못된 이름을 사용했습니다. –

+0

감사합니다. 이것은 도움이되었습니다. 확인 된 ksh88 (AIX 7.1에서)은이 스타일의 프로세스 대체를 지원하지 않습니다. bash를 위해 Ganesh에게 감사하십시오. –

4

이것은 표준 배쉬 확장입니다. <(sort file1)sort file1 명령의 출력으로 파이프를 열고 파이프에 임시 파일 이름을 부여하고 해당 임시 파일 이름을 comm 명령 줄에 전달합니다.

당신은이 프로그램에 전달되는 무엇을 당신에게 echo를 얻어서 어떻게 작동하는지 볼 수 있습니다 : (어쨌든, 경우 ksh93)

echo <(sort file1) <(sort file2) 
관련 문제