カール出力が古いパイプの出力を印刷するのを防ぐ方法は?

カール出力が古いパイプの出力を印刷するのを防ぐ方法は?

暗号化された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 …

(Debianではパッケージ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 fooifne -n fooの違いは次のとおりですdelay foo

  • ifne fooデータまたはEOFを待ってからfooデータが利用可能になったときに実行します。
  • ifne -n fooデータまたはEOFを待ってから、fooデータなしでiffを実行します。
  • delay fooデータまたはEOFを待ってからfoo無条件に実行します。

おすすめ記事