標準出力に日付とシステムの稼働時間を反映するために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
現在のユーザーのホームディレクトリにあるファイルにパイプされます。uptime
tee
example.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