web-dev-qa-db-ja.com

bashスクリプト内のbashスクリプトからstdoutとstderrをリダイレクトする

これをコマンドラインで直接実行すると、stdoutとstderrをスクリプトから次のようなファイルにリダイレクトできることを知っています。

sh myscript1.sh &>output.txt &

ただし、上記のコマンドを実行するコマンドを同じフォルダー内の別のbashスクリプト内に配置すると、コマンドラインを使用する代わりに機能しません。

ターミナルでstdoutとstderrを取得しましたが、output.txtが書き込まれません。これはなぜですか、どうすれば解決できますか?

2
Engineer999

&>は、bashに固有のリダイレクト演算子であることに注意してください。 shを使用して、コマンドラインからスクリプトを実行しているようです(スクリプト自体の#!行に依存していません)。 &>を使用するスクリプトに対してこれを行った場合、/bin/shbashでない可能性があるため、動作が保証されません。

代わりに、標準出力と標準エラーの両方をリダイレクトするポータブルな方法として、

./myscript.sh >output.txt 2>&1

または、&>リダイレクト(および/または他のbash固有のもの)を使用する場合は、bash scriptnameを使用してbashスクリプトを実行するか、スクリプトにbash実行可能ファイルを指す適切な#!行があり、実行可能であることを確認してから、スクリプトを./scriptnameとして実行します。


bash以外のシェルでは、utility &>fileはと同じになります

utility & >file

これはと同じです

utility &
>file

これは、バックグラウンドでutilityを開始し、fileという名前の空のファイルを作成します(または、fileが既に存在する場合は切り捨てます)。そのコマンドにはerrorはなく、bashユーザーが期待することを実行しません。

5
Kusalananda