Bash에서 "<( cmd )" 모드는 어떻게 작동하나요? [복사]

Bash에서 "<( cmd )" 모드는 어떻게 작동하나요? [복사]

Bash에서 내가 사용하는 매개변수는 다음과 같습니다.

paste <(cat file1 | sort) <(cat file2 | sort)

또는

comm <(cat file1 | sort) <(cat file2 | sort)

man comm또는 를 확인하면 man paste설명서에 매개변수가 실제로 파일이라고 나와 있습니다.

질문:

  1. <(cat file1 | sort)및 에 대한 중간 임시 파일이 생성됩니까(TEMP 파일 시스템 또는 느린 디스크의 다른 위치) <(cat file2 | sort)?

  2. 이 마법의 이름은 무엇입니까 <( )? (문서 찾기)

  3. bash에만 해당됩니까, 아니면 다른 쉘에서도 작동합니까?

답변1

이를 프로세스 교체라고 합니다.

3.5.6 프로세스 교체

프로세스 대체를 사용하면 파일 이름을 사용하여 프로세스의 입력 또는 출력을 참조할 수 있습니다.

프로세스 목록은 비동기적으로 실행되며 해당 입력 또는 출력은 파일 이름으로 표시됩니다. 파일 이름은 확장의 결과로 현재 명령에 인수로 전달됩니다. >(목록) 형식을 사용하는 경우 파일에 쓰면 목록에 대한 입력이 제공됩니다. <(목록) 형식을 사용하는 경우 목록의 출력을 얻으려면 인수로 전달된 파일을 읽어야 합니다. < 또는 >와 여는 대괄호 사이에는 공백이 있어서는 안 됩니다. 그렇지 않으면 구문이 리디렉션으로 해석됩니다. 프로세스 대체는 명명된 파이프(FIFO) 또는 /dev/fd 명명된 파일 열기 방법을 지원하는 시스템에서 지원됩니다.

원래 ksh에 등장했기 때문에 단순한 bash가 아니지만 posix 표준에는 없습니다.

내부적으로 프로세스 교체는 두 가지 방법으로 구현됩니다. 이를 지원하는 시스템 /dev/fd(대부분의 Unix 계열 시스템) 에서는 pipe(새 익명 파이프의 파일 설명자를 반환하는 시스템 호출을 호출한 $fd다음 문자열을 생성 /dev/fd/$fd하고 명령줄에서 이를 바꾸는 방식으로 작동합니다. 지원되지 않는 시스템에서는 명명된 파이프를 새 임시 파일 이름으로 /dev/fd만들고 mkfifo명령줄에서 파일 이름을 바꿉니다.

답변2

<( somecommand )출력이 포함된 임시 파일의 파일 이름 으로 생각하면 됩니다 somecommand. 다시 말해서,

utility < <( somecommand )

지름길이다

somecommand >tempfile
utility <tempfile
rm -f tempfile

그리고

utility <( somecommand )

지름길이다

somecommand >tempfile
utility tempfile  # notice the lack of redirection here (utility expected to read from "tempfile")
rm -f tempfile

>( somecommand )표준 입력에 제공될 somecommand임시 파일의 파일 이름 으로 생각할 수도 있습니다. 다시 말해서,

utility > >( somecommand )

지름길이다

utility >tempfile
somecommand <tempfile
rm -f tempfile

그리고

utility >( somecommand )

아마도 지름길

mkfifo temppipe
somecommand <temppipe &
utility temppipe  # utility is expected to write to "temppipe"
rm -f temppipe

(혹은 비슷한 것)

관련 정보