컬 출력이 이전 파이프의 출력을 인쇄하는 것을 방지하는 방법은 무엇입니까?

컬 출력이 이전 파이프의 출력을 인쇄하는 것을 방지하는 방법은 무엇입니까?

암호화된 gpg를 컬로 스트리밍하는 명령이 있습니다.

echo "Some Text" | gpg -o - | curl --silent -T - \
-X PUT \
--output /dev/null \
${myurl} \

이것을 실행하면 다음과 같은 내용이 표시됩니다.

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0Enter passphrase

Passphrase:

여기서 이 "Enter passphrase"부분은 컬 출력 전송에 추가됩니다. 파이프된 특성으로 인해 개행 문자를 삽입할 수 없습니다. 나중에 컬 출력을 실행하는 방법이 있습니까?

답변1

컬 출력이 이전 파이프의 출력을 인쇄하는 것을 방지하는 방법은 무엇입니까?

curl"이전 파이프의 출력"을 인쇄하지 마십시오. 무슨 일이 일어나면 일부 메시지가 터미널에 인쇄 curl됩니다 . gpg이러한 메시지는 서로 간섭합니다.

기억해주세요파이프라인 명령이 동시에 실행됩니다..


gpg성공 출력이 결코 비어 있지 않도록 하려면 다음을 사용하십시오.ifne:

… | gpg … | ifne curl …

(데비안에서는 패키지 ifne에 있습니다 .)moreutils

의 주요 목적은 표준 입력이 비어 있을 때 ifne명령(여기서 : )이 실행되는 것을 방지하는 것입니다 . curl표준 입력이 실제로 비어 있는지 확인하려면 도구는 데이터나 EOF를 기다려야 합니다. 이로 인해 실제 명령이 지연됩니다. 지연만 있으면 됩니다.

gpg올바른 비밀번호를 받은 후에만 인쇄를 시작하고 싶습니다 . 비밀번호를 묻는 테스트는 ifne미리 철저 하게 하지 않았지만 , 비밀번호를 묻는 테스트는 했습니다. 예상대로 작동 한다면 도움이 될 것입니다. 비밀번호를 입력한 후 실행 됩니다 .gpgsudo …gpgifnecurl

Note는 표준 출력에 아무 것도 인쇄되지 않으면(예: 비밀번호가 잘못된 경우) 실행을 ifne방지합니다 . 이 동작은 종종 필요합니다. 그러나 성공 출력이 null일 수 있고 여전히 으로 파이프되어야 하는 경우 단독으로 사용하는 것은 올바른 선택이 아닙니다.curlgpggpgcurlifne

curl아무것도 인쇄 하지 않고 실행하려면 gpg계속 읽으십시오.


아래 코드는 report내 스크립트의 단순화된 버전 입니다.이 답변. 다른 이름으로 저장하세요 delay.

ifne더 복잡한 방식으로 사용됩니다. 코드는 실행 가능한 스크립트여야 합니다(쉘 함수로 만들려고 하지 마세요). 왜냐하면 코드는 자체 호출을 통해 수행되기 때문입니다 ifne "$0"(그리고 ifne함수는 실행될 수 없습니다).

#!/bin/bash

if [ "$1" = "-X" ]; then
   marker=1
   fd="$2"
   shift 2
else
   unset marker
   exec {fd}>&1
fi

if [ "$marker" ]; then
   ( >&"$fd" "$@" )
else
   ifne -n "$0" -X "$fd" "$@" | ifne "$0" -X "$fd" "$@"
fi

의 목적은 delay표준 입력 또는 EOF에 데이터가 있을 때까지 명령 실행을 지연시키는 것입니다. 나중에 사용하도록 설계되었습니다 |.

다음과 같이 사용해야 합니다.

… | gpg … | delay curl …

curlgpg표준 출력으로 인쇄를 시작한 후에만 실행되거나 어떤 이유로든 닫힌 후에만 실행됩니다.

일부 기술적인 세부 사항은연결된 답변.


ifne foo, ifne -n foo의 차이점은 다음 과 같습니다 delay foo.

  • ifne foo데이터 또는 EOF를 기다린 후 foo데이터를 사용할 수 있을 때 실행합니다.
  • ifne -n foo데이터 또는 EOF를 기다린 다음 foo데이터 없이 iff를 실행합니다.
  • delay foo데이터나 EOF를 기다린 후 foo무조건 실행합니다.

관련 정보