Bashスクリプトは、スクリプト出力を別々のログファイルに書き込みます。

Bashスクリプトは、スクリプト出力を別々のログファイルに書き込みます。

標準出力に日付とシステムの稼働時間を反映するためにscipt(example.sh)を作成しました。また、このスクリプトはこの出力をログファイルに書き込もうとしています。これは私のコードです

echo `date`
echo `uptime`

ついに

cat /home/rpeb/example.sh 1> /home/rpeb/example.log 

出力をログファイルにリダイレクトします。

最後の行を記録したくありません。このコードをどのように変更する必要がありますか?

答え1

#!/bin/sh
{ date; uptime; } | tee "$HOME/example.log"

これにより、2つの出力が実行され、date現在のユーザーのホームディレクトリにあるファイルにパイプされます。uptimeteeexample.logそしてスクリプトの標準出力に。{ ...; }一連のコマンドを完全にリダイレクトできる「複合コマンド」に結合するために使用されます。

そうでない場合は、{ ...; }スクリプトで2つのリダイレクトを実行する必要があります。

#!/bin/sh
date   | tee    "$HOME/example.log"
uptime | tee -a "$HOME/example.log"

2番目の呼び出しでは、ログファイルにオプションを追加する必要がteeあります-a。そうしないと、ログファイルが切り捨てられ、コマンドの出力が失われますdate


echo通常、コマンド置換の結果だけを印刷したくありません。コマンドの置き換え(backtickコマンドまたは$(...))は、コマンドの出力を他のコマンドで使用される文字列に挿入するのに役立ちます。出力コマンドの結果にはコマンドの置き換えは必要ありませんecho(たとえば、コマンドラインでこれを行う必要もなく、echo $(ls)スクリプトでも実行する必要もありません)。

答え2

これは働きます:

echo `date`
echo `uptime`

しかし、これは良いです:

echo $(date)
echo $(uptime)

(理由をお読みください。ここ)


そして、この特別なケースでは、次のことに満足できます。

date
uptime

これ:

cat /home/rpeb/example.sh 1> /home/rpeb/example.log

〜しないだろうスクリプトを実行してください。

cat /home/rpeb/example.sh内容のみを印刷してください/home/rpeb/example.sh

その後、そのstdoutコマンドはファイルにリダイレクトされます/home/rpeb/example.log。したがって、ここで実際に行うこと/home/rpeb/example.sh/home/rpeb/example.log。これはあなたが望むものではないようです。

しかし、次のようにするとより簡潔になります。

cat /home/rpeb/example.sh > /home/rpeb/example.log

のみ使用している場合は、>1の内容が暗示されます。


/home/rpeb/example.shスクリプトの実行後にその出力をファイルにリダイレクトするには、/home/rpeb/example.logまず/home/rpeb/example.sh次のように実行権限を付与します。

chmod u+x /home/rpeb/example.sh

次に、スクリプトを実行してパスを作成し、次のように出力をリダイレクトします。

/home/rpeb/example.sh > /home/rpeb/example.log

ただし、両方のファイル(スクリプトとログ)が同じファイルにあり、dirその中にある場合は、dir次のように実行できます。

./example.sh > example.log

example.sh出力を端末に印刷してログインするには、example.log次のようにします。

./example.sh | tee example.log

関連情報