bash '<(file contents)'구문은 무엇입니까?


25

Security StackExchange에 대한답변 은 흥미로운 bash 구문을 사용하여 파일을 인라인으로 생성합니다.

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

이 비트는 특히 흥미 롭습니다 :

<(openssl ecparam -name secp384r1)

그냥 실행 :

echo <(openssl ecparam -name secp384r1)

난 돌아가 겠어 /dev/fd/63

따라서 이것은 파일 내용으로 임시 파일 설명자를 만드는 것 같습니다.

이것이 무엇입니까?


3
결과 "파일"은 실제로 명명 된 파이프이며 일부 프로그램은 파일 인수로이를 지원하지 않습니다. 예 : git diff --no-index file1 <(cat file2)실패합니다 : error: /dev/fd/63: unsupported file type. error: readlink("/dev/fd/63"): No such file or directory구현에서 파이프에 대한 심볼릭 링크를 생성하는지 확인할 수도 있습니다 (어떤 이유로 인해 깨진 링크로 나타남).
Kelvin

답변:


35

프로세스 대체 라고 하며 bash, zsh 및 ksh의 기능입니다 (아마도 다른 사람들은 알지 못합니다). POSIX가 아니므로 이식 가능한 코드로 사용해서는 안되지만 매우 유용합니다.

bash 매뉴얼의 관련 섹션은 다음과 같습니다.

3.5.6 프로세스 대체

프로세스 대체는 명명 된 파이프 (FIFO) 또는 / dev / fd 열린 파일 이름 지정 방법을 지원하는 시스템에서 지원됩니다. 그것은 형태를 취합니다

  <(list) 

또는

  >(list) 

프로세스 목록은 입력 또는 출력이 FIFO 또는 / dev / fd의 일부 파일에 연결된 상태로 실행됩니다. 이 파일의 이름은 확장 결과로 현재 명령에 인수로 전달됩니다. > (list) 양식을 사용하는 경우 파일에 쓰면 목록에 대한 입력이 제공됩니다. <(list) 형식을 사용하는 경우 인수로 전달 된 파일을 읽어 목록의 출력을 확보해야합니다. <또는>와 왼쪽 괄호 사이에 공백이 없을 수 있습니다. 그렇지 않으면 구문이 리디렉션으로 해석됩니다.

사용 가능한 경우 프로세스 대체는 매개 변수 및 변수 확장, 명령 대체 및 산술 확장과 동시에 수행됩니다.

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