다른 파일에서 stdout 및 stderr을 리디렉션하는 방법

다른 파일에서 stdout 및 stderr을 리디렉션하는 방법

쉘 스크립트를 실행하는 동안 쉘 스크립트의 출력을 두 개의 다른 파일로 어떻게 리디렉션할 수 있습니까? 즉, 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

관련 정보