ステータスコードが役に立たないときにstdout出力でパイプラインを構築する方法はありますか?
回答がユースケースをカバーするのではなく、シェルスクリプトの範囲内の問題に対処することを願っています。私が望むのは、国と言語コードに基づいて名前を推測して、リポジトリで利用可能な最も具体的なパッケージを見つけることです。
たとえば、次のようになります。
$PACKAGE1=hunspell-en-zz
$PACKAGE2=hunspell-en
最初の推測がより適切ですが、存在しない可能性があります。この場合、最初のオプション()が返すのでhunspell-en
()を返したいと思います。$PACKAGE2
hunspell-en-zz
$PACKAGE1
いいえ存在する。
適切なキャッシュパイプライン
ドキュメントでコマンドを実行できる限り、コマンドはapt-cache
成功を返します(シェルは終了コード0として定義されています)。apt-cache
apt-cache は通常動作中は 0 を返し、エラーが発生した場合は 10 進数 100 を返します。
これにより、パイプラインでコマンドを使用することがより困難になります。通常、404に対応するパッケージ検索ではエラーが発生すると予想されます(curl
ORと同様wget
)。パッケージが存在するか、存在しないかを検索したいと思います。他のパッケージがある場合は、他のパッケージに置き換え。
最初のコマンドは成功を返すため、何も返されません(したがって実行中のrhsは決して実行されません||
)。
apt-cache search hunspell-en-zz || apt-cache search hunspell-en
apt-cache search
2つのパラメータがあります。
apt-cache
引数が次のとおりであるため、何も返しません。
apt-cache search hunspell-en-zz hunspell-en
ドキュメントからapt-cache
別々のパラメータを使用して、およびで結合された複数の検索パターンを指定できます。
したがって、これらのパラメータの1つは明らかに存在しないため、何も返されません。
質問
apt-cache
戻りコードが操作に役立たない場合、ルールを処理するためのシェルイディオムは何ですか?成功はSTDOUTの出力かどうかにかかっていますか?
〜のように
-
それらはすべて同じ問題に由来します。残念ながら、ここで選択した回答には
find -z
適用されない解決策が記載されており、ユースケースによって異なります。 NULL 出口を使用せず、イディオムやパイプ構成についての言及はありません(上記のオプションではありませんapt-cache
)。
ベストアンサー1
コマンドを受け入れ、出力がある場合はtrueを返す関数を作成します。
r() { local x=$("$@"); [ -n "$x" ] && echo "$x"; }
( ( r echo -n ) || echo 'nada' ) | cat # Prints 'nada'
( ( r echo -n foo ) || echo 'nada' ) | cat # Prints 'foo'
したがって、このユースケースでは次のように動作します。
r apt-cache search hunspell-en-zz || r apt-cache search hunspell-en