質問

質問

ステータスコードが役に立たないときにstdout出力でパイプラインを構築する方法はありますか?

回答がユースケースをカバーするのではなく、シェルスクリプトの範囲内の問題に対処することを願っています。私が望むのは、国と言語コードに基づいて名前を推測して、リポジトリで利用可能な最も具体的なパッケージを見つけることです。

たとえば、次のようになります。

  • $PACKAGE1=hunspell-en-zz
  • $PACKAGE2=hunspell-en

最初の推測がより適切ですが、存在しない可能性があります。この場合、最初のオプション()が返すのでhunspell-en()を返したいと思います。$PACKAGE2hunspell-en-zz$PACKAGE1いいえ存在する。

適切なキャッシュパイプライン

ドキュメントでコマンドを実行できる限り、コマンドはapt-cache成功を返します(シェルは終了コード0として定義されています)。apt-cache

apt-cache は通常動作中は 0 を返し、エラーが発生した場合は 10 進数 100 を返します。

これにより、パイプラインでコマンドを使用することがより困難になります。通常、404に対応するパッケージ検索ではエラーが発生すると予想されます(curlORと同様wget)。パッケージが存在するか、存在しないかを検索したいと思います。他のパッケージがある場合は、他のパッケージに置き換え

最初のコマンドは成功を返すため、何も返されません(したがって実行中のrhsは決して実行されません||)。

apt-cache search hunspell-en-zz || apt-cache search hunspell-en

apt-cache search2つのパラメータがあります。

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

おすすめ記事