シェルスクリプトの実行中にシェルスクリプトの出力を2つの異なるファイルにリダイレクトできますか?つまり、STDOUTとSTDERRファイルです。エラーがある場合は、ログをSTDERRファイルに移動し、スクリプトが正常に実行されると、STDOUTファイルの下にログを生成する必要があります。
答え1
この試み:
echo "test" 1>STDOUT 2>STDERR
echo "test"
コマンドまたはスクリプトに置き換えます。
簡単な例:
script.sh コンテンツを生成します。
#!/bin/bash
du -shc /*
実行権限を追加します。
chmod u+x script.sh
そして実行してください:
./script.sh 1>STDOUT 2>STDERR
次に、個々のファイルを表示します。
# cat STDOUT
8,6M /bin
39M /boot
0 /dev
4,1M /etc
1,1G /home
0 /initrd.img
0 /initrd.img.old
231M /lib
4,0K /lib64
# cat STDERR
du: cannot access `./proc/7422/task/7422/fd/4': No such file or directory
du: cannot access `./proc/7422/task/7422/fdinfo/4': No such file or directory
du: cannot access `./proc/7422/fd/4': No such file or directory
du: cannot access `./proc/7422/fdinfo/4': No such file or directory
スクリプト内でリダイレクトを設定するには、次のようにします。 exec
:
#!/bin/bash
exec 1>STDOUT 2>STDERR
du -shc /*
単にスクリプトを実行してください。
./script.sh
説明する:
1>filename
Redirect stdout to file "filename."
1>>filename
Redirect and append stdout to file "filename."
2>filename
Redirect stderr to file "filename."
2>>filename
Redirect and append stderr to file "filename."
&>filename
Redirect both stdout and stderr to file "filename."
This operator is now functional, as of Bash 4, final release.
M>N
"M" is a file descriptor, which defaults to 1, if not explicitly set.
"N" is a filename.
File descriptor "M" is redirect to file "N."
M>&N
"M" is a file descriptor, which defaults to 1, if not set.
"N" is another file descriptor.
詳細については、次を参照してください。入力/出力リダイレクト
答え2
シェルスクリプトの例:
#!/bin/bash
echo "Good"
# and something bad I can't do under ordinary user
touch /root/something
次に実行:
$ test.sh 1>/tmp/STDOUT 2>/tmp/STDERR
内容は次のとおりです。
$ cat /tmp/STDOUT
Good
$ cat /tmp/STDERR
touch: cannot touch '/root/something': Permission denied