[解決済み】シェルスクリプト全体の出力を、スクリプト自体の中でリダイレクトするには?
質問
Bourne シェルスクリプトの出力をすべてどこかにリダイレクトすることは可能ですか?ただし、シェルコマンドはスクリプト自体の中に入れてください。
一つのコマンドの出力をリダイレクトするのは簡単ですが、もう少しこういったものが欲しいのです。
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
意味:スクリプトが非対話的に実行される場合(例えば、cron)、すべての出力をファイルに保存してください。 シェルから対話的に実行される場合は、通常通り標準出力に出力させる。
FreeBSDのperiodicユーティリティで通常実行されるスクリプトでこれを行いたいのです。 これは毎日実行されるものの一部で、普段は毎日メールで見る気にならないので、送信させないようにしています。 しかし、この特定のスクリプト内の何かが失敗した場合、それは私にとって重要であり、毎日のジョブのこの部分の出力をキャプチャしてメールできるようにしたいのです。
更新:Joshuaの回答は的確ですが、私もスクリプト全体のstdoutとstderrの保存と復元をしたかったので、このようにしました。
# save stdout and stderr to file
# descriptors 3 and 4,
# then redirect them to "foo"
exec 3>&1 4>&2 >foo 2>&1
# ...
# restore stdout and stderr
exec 1>&3 2>&4
解決方法は?
更新された質問に対応します。
#...part of script without redirection...
{
#...part of script with redirection...
} > file1 2>file2 # ...and others as appropriate...
#...residue of script without redirection...
中括弧 '{ ... }' は、I/Oリダイレクションの単位となるものです。 中括弧は、コマンドが出現しうる場所、簡単に言えば、行頭かセミコロンの後に出現させなければならない。 ( そう、もっと正確に言えばいいんだ。屁理屈を言いたいなら言ってくれ。 )
あなたが示したリダイレクトで元の標準出力と標準エラー出力を保持できるのは正しいのですが、通常は上記のようにリダイレクトされたコードをスコープ化した方が、後でスクリプトをメンテナンスしなければならない人たちにとって何が起こっているのか理解するのがよりシンプルになります。
Bashマニュアルの該当箇所は コマンドのグループ化 と I/Oリダイレクション . POSIX シェル仕様の該当箇所は以下の通りです。 複合コマンド と I/Oリダイレクション . Bashにはいくつかの特別な表記がありますが、それ以外はPOSIXシェル仕様に似ています。
関連
-
[解決済み] パイプと二重パイプのどちらの OR 演算子を使うか?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] あるディレクトリにあるすべてのコード行を再帰的にカウントするにはどうすればよいですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] シェルスクリプトでブール変数を宣言して使用するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「ambiguous redirect」エラーが発生する
-
[解決済み】予期しないトークン 'fi' 付近の構文エラー
-
[解決済み] bash : cd : 引数が多すぎる [閉店].
-
[解決済み] MacOSのbashターミナルでexport PS1="\u[\033[m]@[\033[32m]\h:\[\033[33;1m]\w[\033[m]\$" は何を意味していますか?
-
[解決済み] /bin/sh: apt-get: 見つかりません。
-
[解決済み] bashスクリプトで変数の束縛を解除
-
[解決済み] findコマンドと一緒に使用するとエラー 'rm: missing operand' が発生する。
-
[解決済み] nohupプロセスを終了させる方法を教えてください。
-
[解決済み] Bashのforeachループ
-
[解決済み】bashスクリプト自身からstdoutのCOPYをログファイルにリダイレクトする。