ステータスコードが役に立たない場合、標準出力からの出力に基づいてパイプラインを構築する方法はありますか?
ユースケースではなく、シェルスクリプトの範囲内の質問に答える方がいいと思います。私がやろうとしていることは、国と言語コードに基づいて名前を推測することにより、リポジトリで利用可能な最も具体的なパッケージを見つけることです。
これを例にとると、
$PACKAGE1=hunspell-en-zz
$PACKAGE2=hunspell-en
最初の推測はより適切ですが、存在しない可能性があります。この場合、最初のオプション()が存在しないため、hunspell-en
($PACKAGE2
)を返します。hunspell-en-zz
$PACKAGE1
apt-cacheのパイプライン
apt-cache
コマンドが実行できる場合は常に、シェルによって終了コード0として定義されるコマンドが成功を返します(のドキュメントからapt-cache
)
apt-cacheは通常の操作ではゼロを返し、エラーの場合は10進数の100を返します。
これにより、パイプラインでのコマンドの使用がより困難になります。通常、私は404に相当するパッケージ検索でエラーが発生することを期待しています(curl
またはで発生しますwget
)。パッケージが存在するかどうかを確認し、存在しない場合は別のパッケージにフォールバックしたい。
最初のコマンドが成功を返すため、これは何も返しません(したがって、||
neverのrhs は実行されません)。
apt-cache search hunspell-en-zz || apt-cache search hunspell-en
apt-cache search
2つの引数
これは、apt-cache
その引数のANDを取るため、何も返しません。
apt-cache search hunspell-en-zz hunspell-en
のドキュメントから apt-cache
別々の引数を使用して、AND結合された複数の検索パターンを指定できます。
したがって、これらの引数の1つが明らかに存在しないため、これは何も返しません。
質問
apt-cache
タスクに戻りコードが役に立たない場合に見られるような規則を処理するためのシェルイディオムは何ですか?そして、成功はSTDOUT上の出力の存在によってのみ決定されますか?
に似ている
-
どちらも同じ問題に起因しています。そこで選択された答えは
find -z
、残念なことに、ここで適用できる解決策ではなく、ユースケース固有のものです。ヌル終了を使用せずにイディオムやパイプラインを構築することについての言及はありません(のオプションではありませんapt-cache
)
hunspell-ar
です。特定の国と言語で最も正確なパッケージを見つける必要があります。
find
これはまさにapt-cache
この点に似ています-役に立たない戻りコード、成功は出力に基づいています。
-z
、残念ながらここでは解決策ではないため、ユースケース固有の問題は適用されないことを言及しています。そして、イディオムやnull終了を使用せずにパイプラインを構築することについては言及されていません(のオプションではありませんapt-cache
)
find
して使用すること-print0
ではgrepとなります-z
。apt-cacheはnullで終了する出力を提供しないため、は必要ありません-z
。
hunspell-en
存在しますか?とにかく、あなたはapt-cache policy
grep forを使うことができます^$PACKAGENAME:
。