Bash에서 내가 사용하는 매개변수는 다음과 같습니다.
paste <(cat file1 | sort) <(cat file2 | sort)
또는
comm <(cat file1 | sort) <(cat file2 | sort)
man comm
또는 를 확인하면 man paste
설명서에 매개변수가 실제로 파일이라고 나와 있습니다.
질문:
<(cat file1 | sort)
및 에 대한 중간 임시 파일이 생성됩니까(TEMP 파일 시스템 또는 느린 디스크의 다른 위치)<(cat file2 | sort)
?이 마법의 이름은 무엇입니까
<( )
? (문서 찾기)bash에만 해당됩니까, 아니면 다른 쉘에서도 작동합니까?
답변1
이를 프로세스 교체라고 합니다.
프로세스 대체를 사용하면 파일 이름을 사용하여 프로세스의 입력 또는 출력을 참조할 수 있습니다.
프로세스 목록은 비동기적으로 실행되며 해당 입력 또는 출력은 파일 이름으로 표시됩니다. 파일 이름은 확장의 결과로 현재 명령에 인수로 전달됩니다. >(목록) 형식을 사용하는 경우 파일에 쓰면 목록에 대한 입력이 제공됩니다. <(목록) 형식을 사용하는 경우 목록의 출력을 얻으려면 인수로 전달된 파일을 읽어야 합니다. < 또는 >와 여는 대괄호 사이에는 공백이 있어서는 안 됩니다. 그렇지 않으면 구문이 리디렉션으로 해석됩니다. 프로세스 대체는 명명된 파이프(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
(혹은 비슷한 것)