ファイルとコンソールに出力するためのシェルスクリプトの準備

ファイルとコンソールに出力するためのシェルスクリプトの準備

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

関連情報