私はあなたが必要とすることをすると思います。 # THE SCRIPT ITSELF
と# END
間あなたがecho
何か場合は、THE FOLLOWING DATA HAS BEEN WRITTEN TO STDOUT
は...他にSTDOUT HAS NOT BEEN TOUCHED
印刷されます
#!/bin/bash
readonly TMP=$(mktemp /tmp/test_XXXXXX)
exec 3<> "$TMP" # open tmp file as fd 3
exec 4>&1 # save current value of stdout as fd 4
exec >&3 # redirect stdout to fd 3 (tmp file)
# THE SCRIPT ITSELF
echo Hello World
# END
exec >&4 # restore save stdout
exec 3>&- # close tmp file
TMP_SIZE=$(stat -f %z "$TMP")
if [ $TMP_SIZE -gt 0 ]; then
echo "THE FOLLOWING DATA HAS BEEN WRITTEN TO STDOUT"
echo
cat "$TMP"
else
echo "STDOUT HAS NOT BEEN TOUCHED"
fi
rm "$TMP"
だから、スクリプトの出力があるよう:
THE FOLLOWING DATA HAS BEEN WRITTEN TO STDOUT
Hello World
、あなたはecho Hello World
行を削除する場合:
STDOUT HAS NOT BEEN TOUCHED
スクリプトを実行している間に実際にテストしたい場合は、その、あまりにも
#!/bin/bash
#FIRST ELSE
function echo_fl() {
TMP_SIZE=$(stat -f %z "$TMP")
if [ $TMP_SIZE -gt 0 ]; then
echo $2
else
echo $1
fi
}
TMP=$(mktemp /tmp/test_XXXXXX)
exec 3 "$TMP" # open tmp file as fd 3
exec 4>&1 # save current value of stdout as fd 4
exec >&3 # redirect stdout to fd 3 (tmp file)
# THE SCRIPT ITSELF
for f in fst snd trd; do
echo_fl "$(echo $f | tr a-z A-Z)" "$f"
done
# END
exec >&4 # restore save stdout
exec 3>&- # close tmp file
TMP_SIZE=$(stat -f %z "$TMP")
if [ $TMP_SIZE -gt 0 ]; then
echo "THE FOLLOWING DATA HAS BEEN WRITTEN TO STDOUT"
echo
cat "$TMP"
else
echo "STDOUT HAS NOT BEEN TOUCHED"
fi
rm "$TMP"
:-)出力は次のようになります。
THE FOLLOWING DATA HAS BEEN WRITTEN TO STDOUT
FST
snd
trd
あなたが見ることができるように:のみ最初の行(FST
は)上のキャップを持っています。それはあなたのためにecho_fl
関数が何をしているのかです:出力の最初の行で、最初の引数をエコーした場合、2番目の引数:-)をエコーします。
なぜ変数を避けたいですか?コードをより読みやすく保守しやすくします。知覚される費用は何ですか? – Johnsyweb
ループカウンタをテストするだけではどうですか?私はあなたが言うことを知っている**私は変数**を避けたいですが、なぜですか? 'tmpfileへのリダイレクト'は良い解決策ですが、あなたは変数よりもずっと多くを追加しています...単純な 'declare -i cnt; while [あなたのループ]。 #stuffを実行します。 if [cnt -eq 0];それからprintf "a";そうでなければprintf "b"; fi; ((cnt ++)); doneはかなり短く、IO時間とオーバーヘッドを追加するtmpfileを避けます。 –