tee
出力をファイルにコピーしてコンソールに出力するために使用できることがわかります。
tee
ただし、スクリプト内のすべてのコマンドを使用したり、パイプを使用してスクリプトを実行しないと(固定テンプレートなど)、シェルスクリプトを準備する方法が見つからないようですtee
。
tee
したがって、スクリプトが自動的に呼び出されるのではなく、パイプラインを使用して毎回スクリプトを呼び出す必要があります。
修正されたshebangを使ってパイプを試しましたが、成功しませんでした。これを達成する方法が見つからないようです。
したがって、次のようにスクリプトを呼び出さないでください。
./myscript.sh |& tee scriptout.txt
次のように呼び出して同じ効果を得たいと思います。
./myscript
もちろん、スクリプトはスクリプト内の変数に設定されたファイル名を知る必要があります。
どうすればいいですか?
答え1
スクリプトの内容を関数にラップし、関数の出力を次にパイプすることができますtee
。
#!/bin/bash
{
echo "example script"
} | tee -a /logfile.txt
答え2
を使用して、スクリプトの先頭に出力を設定するなどの操作を実行できますexec
。 (まだこれについて強力なテストを実施していません。)
#!/bin/bash
# Split script output to stdout and to the logfile
exec 1> >(tee -a "/tmp/${0##*/}.log")
# Write a message
echo hello, world
# Empirical pause before exiting to wait for all output to get through the tee
sleep 1
exit 0
たとえば、スクリプトが呼び出され、次のようにdemo
実行可能になったとしますchmod a+x demo
。
ls -l /tmp/demo.log
ls: cannot access '/tmp/demo.log': No such file or directory
./demo
hello, world
cat /tmp/demo.log
hello, world