암호화된 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
미리 철저 하게 하지 않았지만 , 비밀번호를 묻는 테스트는 했습니다. 예상대로 작동 한다면 도움이 될 것입니다. 비밀번호를 입력한 후 실행 됩니다 .gpg
sudo …
gpg
ifne
curl
Note는 표준 출력에 아무 것도 인쇄되지 않으면(예: 비밀번호가 잘못된 경우) 실행을 ifne
방지합니다 . 이 동작은 종종 필요합니다. 그러나 성공 출력이 null일 수 있고 여전히 으로 파이프되어야 하는 경우 단독으로 사용하는 것은 올바른 선택이 아닙니다.curl
gpg
gpg
curl
ifne
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 …
curl
gpg
표준 출력으로 인쇄를 시작한 후에만 실행되거나 어떤 이유로든 닫힌 후에만 실행됩니다.
일부 기술적인 세부 사항은연결된 답변.
ifne foo
, ifne -n foo
의 차이점은 다음 과 같습니다 delay foo
.
ifne foo
데이터 또는 EOF를 기다린 후foo
데이터를 사용할 수 있을 때 실행합니다.ifne -n foo
데이터 또는 EOF를 기다린 다음foo
데이터 없이 iff를 실행합니다.delay foo
데이터나 EOF를 기다린 후foo
무조건 실행합니다.