Bash의 파일 설명자 및 리디렉션

Bash의 파일 설명자 및 리디렉션

누군가 이 명령이 작동하는 이유를 설명할 수 있습니까?

gpg --enable-special-filenames --verify --batch \
  <(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
  <(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)

"curl: (23) Failedwriting body (0 != 4096) (23) Failedwriting body" 오류 메시지와 함께 실패함:

gpg --enable-special-filenames --verify --batch -- '-&3' '-&4' \
  3<(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
  4<(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)

답변1

특정 파일 설명자로 리디렉션사용 3< file.프로세스 대체을 사용하여 <( ... )두 가지를 결합하려면 사용해야 합니다.둘 다:

3< <( ... )

공간은 중요합니다. 그렇지 않으면 노력하는 것으로 해석됩니다.여기 문서로 종료되지만 (유효하지 않으며 구문 분석 오류가 발생합니다.


명령 gpg줄은 다음과 같아야 합니다.

gpg --enable-special-filenames --verify --batch -- '-&3' '-&4' \
    3< <(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
    4< <(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)

curl이는 일반 파일에서 읽은 것처럼 첫 번째 명령의 출력을 설명자 3으로 리디렉션하고 두 번째 명령의 출력을 설명자 4로 리디렉션합니다 .


그런 식으로<( ... ) 일하다명령을 실행하고 해당 출력을 FIFO 또는 그 아래 항목에 연결한 /dev/fd다음 <( ... )파일이 처음에 작성된 것처럼 명령줄의 일반 인수로 파일 경로를 대체한다는 것입니다. 그러면 파일 경로를 리디렉션과 같은 다른 구성과 함께 사용할 수 있습니다.

원래 명령은 결국 실행되고 gpg ... 3/dev/fd/63 4/dev/fd/64, curl작성된 내용에 아무도 관심이 없다는 사실을 발견하고 오류를 보고합니다. 또한 파일이 출력 gpg에는 숨겨져 있지만 파일이 존재하지 않는다는 오류가 발생합니다 .curl

관련 정보