私は次の解決策を使用しています。コマンドが空の文字列を出力するかどうかをテストする。これらの回避策に加えて、コマンド出力を印刷したい(空でない場合)。
コマンドの出力が空でない場合は、コマンドを一度だけ呼び出してコマンドの出力を印刷できるかどうかを知りたいです。
で同じコマンドを再度呼び出すことでこれを行うことができますが、if condition
結果はすでに存在するため、2回目の呼び出しでCPU使用率がさらに消費される可能性があります。
可能な方法は、同じコマンドが2回呼び出されることです。
if [[ $(ls -A) ]]; then
ls -A
else
echo "no files found"
fi
output=$(git diff --ignore-blank-lines --color-words HEAD | tr -d ' \n\r\t ' | wc -c)
if [ "$output" -gt 0 ]; then
git diff --ignore-blank-lines --color-words HEAD
else
echo "diff is empty"
fi
答え1
メモ:この質問はもともとタグ付けされました。強く打つしかし、OPは使用されたシェルがと述べましたzsh
。これにより回答がやや有効になりません。
コマンドの出力を変数に保存し、変数が空であることをテストできます。
output="$(your_command)"
if [[ -n $output ]]
then
printf -- "%s\n" "$output"
else
printf -- "No output\n"
fi
このテストは空でない文字列であることを-n
確認します。$output
では、$output
何が印刷されますか?それ以外の場合は、出力が生成されなかったというメッセージが出力されます。気づく周囲の引用符"$output"
が必要です。
また参考にしてください(@ilkkachuが述べたように)末尾の改行はコマンド置換によって削除されるので、それに興味がある場合は別のアプローチを取る必要があります。
答え2
いずれにせよ、出力が必要な場合は、パイプを使用しtee
てコマンドを再実行しなくても出力をコピーできます。一度は標準出力で、一度は空の入力で動作するコマンドとして使用します。
たとえば、
ls | tee >([ $(wc -m) -gt 0 ] || echo No output)
これは標準出力のみを処理するため、エラーメッセージの後に「出力なし」が表示されることがあります。端末に送信するかどうかによってコマンドの出力が変わった場合は、それに合わせてコマンドも調整する必要があります(例えば ls -C
または色で出力)。
答え3
コマンドの例として、次の操作が実行さls -A
れます。
if ls -A | grep ^; then
: the output was already written
else
: no output
fi
if ! ls -A | grep ^; then
: handle the no-output condition
fi
これにより、末尾の改行が出力に保存されます。
この記事に記載されている実際のケースについてコメント(空の出力で実行しないでください)(「1画面の場合は終了」)オプションがless
あります。-F
command ... | less -FXR
(X
最新バージョンは省略できますless
)。