解決策を提案する前に、これが想像以上に難しいことを説明させてください。基本的な問題はタイミングです。open ...
関数は実行時に出力を生成します。実行が終了した後 (したがって、出力が生成された後) に終了ステータスが生成されます。終了ステータスに応じて出力でさまざまなことをしたいので、関数が終了するまで出力を一時的にどこかに保存する必要があり、出力をどうするかを決めることができます。
パイプはデータを保存しないため (わずかなバッファ スペースを除いて)、本質的にパイプは機能しません。パイプはデータをあるプログラムから別のプログラムに "ライブ" で渡します。この場合、2 番目のプログラムは起動できません。最初が終わるまで。通常、これには一時ファイルが最適ですが (ファイルの目的はデータの保存です)、セキュリティ上の理由からそれは望ましくありません。これにより、データをRAMのどこかに配置する必要がほとんどなくなります(ただし、完全に安全というわけではありません...)。
@Karoly Horvath の回答では、出力を bash 変数 (RAM に格納) に格納することを提案しましたが、bash は変数値の null バイトに対応していないため、うまくいきませんでした。そこで、データの「安全な」エンコーディングを使用し、それを bash 変数に入れるバリアントを提案します。私は uuencode 形式を使用しましたが、base64 や 16 進ダンプなども使用できます...
if result=$(open "$@" "$PASSWORD" | uuencode -; exit ${PIPESTATUS[0]}); then
echo "$result" | uudecode -p | SOMECOMMAND
fi
PIPESTATUS はバシズムであるため、スクリプトを で開始する必要があることに注意してください#!/bin/bash
。また、出力が長すぎる場合、bash が保存/展開/その他を希望するデータの量が制限される可能性があります。それが問題になると、事態はさらに複雑になります。
ところで、セキュリティが心配な場合は、gpg2 の--passphrase
オプションを使用しないでください。コマンド ラインでパスフレーズを渡すとps
、適切なタイミングで実行する人などに公開されてしまいます。これは非常に悪い考えです。gpg2 にはパスフレーズを提供するための多くのオプションがあるため、より良いものを使用してください。