複数のパイプで終わるシェルスクリプトがあり、出力が空の場合はgrep ... | while read ...| sort | uniq
1を返したいのですが、入力が空の場合でもuniqは常に0を返します。
これまで私が見つけた最良の解決策は、空のパターンでgrepを追加することです... uniq | grep ''
。これは完全に機能しますが、ハッキングのように感じます。
だから私の質問は:これを行うより良い/標準的な方法はありますか?
いくつかの制限事項:
- 後でもう一度印刷する必要があるため、出力を変数にキャプチャしたくありません。
a=$(... | uniq); printf '%s\n' "$a"; [ -n "$a" ]
これも正しいとは思われません。 - 可能であれば、標準ツール(もはやユーティリティなし)とポータブルツールを好みます。
ありがとうございます!
答え1
正直| grep ''
大丈夫だと思います。パイプラインにはすでに多くのプログラムがあるため、他のプログラムを開発しても問題にはなりません。そして、あなたはそれが何であるgrep
かをすでに知っているので、これを行うために「スマートな」シェルを作成する必要はありません。
コメントでは、| grep .
これが別の可能性である可能性があると述べました。grep .
空白行は一致せずに一致するため、grep ''
必要な内容に合わせて選択してください。
ただし、これらの使用はgrep
一般の読者にはすぐにはわかりません。
答え2
私はこれが仕事をしなければならないと思います:
[ -n "$(command | tee /dev/tty)" ]
tee
command
出力はstdout(コマンドで評価test
)と端末()に送信される/dev/tty
ため、出力を変数にキャプチャすることなく表示できます。
これはPOSIX互換ソリューションAFAIKです。