リダイレクトファイルをカスタム順序にする方法

リダイレクトファイルをカスタム順序にする方法

これは私のテスト.shファイルです。

エラーと出力.sh

#!/bin/bash

echo myecho
ls dflj

私が走ると、./errorandoutput.sh >file 2>&1私たちはこのようなものを得ることができますfile

STDOUTしかし、情報が裏にあることを願っていますSTDERR。だからコマンドを次に変更しました。

./errorandoutput.sh >file 1>&2

しかし、私は空のものを得ますfile。情報がリダイレクトの背後にあるようにするにはどうすればよいですかSTDOUTSTDERRfile


file私の言葉は、私が良いことを受け取ることができたらいいのです。

ls: cannot access 'dflj': No such file or directory
myecho

答え1

これは、リダイレクト順序が機能する方法ではありません。

リダイレクト順序は、シェルがファイルの内容ではなくファイル記述に対して操作を実行する順序のみを決定します。

存在する:

./errorandoutput.sh >file 2>&1

まず、シェルは標準出力にリダイレクトfileし、次に標準エラーをリダイレクトします。これは標準出力を指すfileので、標準出力と標準エラーの両方に移動しますfile

この段階で、シェルはリダイレクトを完了しました。ファイルの内容とは何の関係もありませんfile

コンテンツの順序は、fileスクリプト内で実行されるコマンドの順序によって決定されます。スクリプトを次のように変更します。

#!/bin/bash

ls dflj
echo myecho

あなたはあなたが望むものを得るでしょう。

答え2

これ>'は"1**>**"のように動作します。

これはうまくいきます

./errorandoutput.sh  2>file  1>&2



$ ( echo yay ; fhgfhgf ) > out 2>&1
$ cat out
yay
bash: fhgfhgf: command not found
$ ( echo yay ; fhgfhgf ) 2> out 1>&2
$ cat out
yay
bash: fhgfhgf: command not found

答え3

重要な場合は、標準出力をファイルに送信して出力します。もちろん、これにはスクリプトが必要です。

temp=/tmp/yc$$
yourcommand > ${temp}
cat ${temp} && rm -f ${temp}

関連情報