9

POSIXシェルで任意のコマンドが出力を生成したかどうかを効率的にチェックする方法は? (としましょうgit ls-files --killed。)

明白な方法が 3 つありますが、どれも私には醜いまたは悪いように思えます。

  1. [ -n "$(git ls-files --killed)" ] - コマンドの完全な出力をメモリにキャプチャし、テストに渡す必要があります(少なくともビルトインであることが望ましい)
  2. [ "$(git ls-files --killed | wc -c)" -gt 0 ] - 2 つの fork-exec が関与
  3. TMP=$(一時ファイル); git ls-files --killed >"$tempfile"; [ -s "$tempfile" ] && ...; rm "$tempfile" - 中間一時ファイル (ここでもすべての出力をキャプチャします) が必要です
4

4 に答える 4

4

コマンドの終了ステータスも確認できます。通常、コマンドが正常に実行されると、終了ステータス 0 が返されます。

git ls-files --killed > /dev/null
if [ $? -eq 0 ]

または、コマンドの出力のみに依存したい場合は、最初のhead -1オプションと一緒に " " を使用できます。とにかく、結果を知る以外にコマンド出力で処理を行っていないように見えるからです。

于 2013-06-28T00:29:12.180 に答える
4

私の推奨するソリューションでは、POSIX シェル ビルトインを使用しますread

if git ls-files --killed | read REPLY; then
  echo "Some output"
else
  echo "No output or git failed"
fi

readstdin から (および変数 にREPLY) 行を読み取ろうとし、成功した場合は 0 を返し、失敗した場合は正の終了コードを返します。パイプラインの残りは読み取られません。bash のみ、REPLY省略した場合のデフォルト名なのでread REPLY、単にread.

このアプローチの潜在的な欠点は、問題のプログラム (例では git) の終了コードがチェックされないことです。

于 2015-08-27T02:16:28.880 に答える
1

このソリューションは他のソリューションと同じくらいハックだと思うかもしれませんが、他のソリューションよりもメモリ使用量が少ないと思います (私はシェル スクリプトの効率の専門家ではありません)。

コードは bash のみです。

z=0
while read -r -n1 char; do
  z=1
  break
done < <(git ls-files --killed)
[ $z != 0 ]

一時ファイルの代わりに一時変数を使用し、 read は一度に 1 文字しか機能しないと思いますが、 git ls-files コマンドは引き続き完全に実行される可能性があります。

それほど醜いわけではありませんが、少なくともより効率的であると思います。

于 2013-06-28T00:45:29.977 に答える
0

POSIX について言及されているので、この回答
を参照します。POSIX システムでは必要なため、/usr/bin/test を使用します。

/usr/bin/test -n "$(git ls-files --killed)"

于 2013-06-28T00:52:46.653 に答える