他の呼び出しによって出力された数値に基づいて行を出力するifステートメントを持つシェルスクリプトがあります。 (私の場合、何かをすると1行以上の出力が発生しました。)
LINES=$(function_call | wc -l)
if [ "$LINES" -gt 1 ]
then
do_stuff
fi
しかし、私が望むのは、出力を消費するのではなく(つまり、まだ標準出力に表示されるようにすること)、スクリプトに同じことをすることです。
答え1
使用tee
(システムサポート仮定/dev/fd/<n>
):
{
lines=$(function_call 3>&- | tee -a /dev/fd/3 | wc -l)
} 3>&1
if [ "$lines" -gt 1 ]; then
do_stuff
fi
奇妙な実装を使用するLinuxでは、/dev/fd/<n>
stdoutがファイルにリダイレクトされると出力が補間されます。最後にそのファイルのスクリプト内の stdout の現在の場所が終わりではありません (通常、stdout はほとんど配置されないため、これは重要ではありません)。~へ文書1つ)。
または、次のことができます。
{
lines=$(function_call 3>&- | sed -ne 'w /dev/fd/3' -e '$=')
} 3>&1
または:
{
lines=$(function_call 3>&- | awk '{print > "/dev/fd/3"}; END {print NR}')
} 3>&1
sed
(orの実装によっては、最後の改行文字の後に追加のデータを出力するawk
よりも1つ多くを提供できます。)wc -l
function_call