질문자 :flybywire
Bash에서 표준 출력 을 잘린 파일로 리디렉션하려면 다음을 사용하는 방법을 알고 있습니다.
cmd > file.txt
파일에 추가하여 Bash에서 표준 출력을 리디렉션하려면 다음을 사용하는 방법을 알고 있습니다.
cmd >> file.txt
표준 출력과 표준 오류 를 모두 잘린 파일로 리디렉션하려면 다음을 사용하는 방법을 알고 있습니다.
cmd &> file.txt
파일에 추가하는 표준 출력과 표준 오류를 모두 리디렉션하려면 어떻게 해야 합니까? cmd &>> file.txt
가 작동하지 않았습니다.
cmd >>file.txt 2>&1
Bash는 다음과 같이 왼쪽에서 오른쪽으로 리디렉션을 실행합니다.
-
>>file.txt
: 추가 모드에서 file.txt
stdout
리디렉션합니다. -
2>&1
: stderr
을 stdout
이 현재 가고 있는 곳"으로 리디렉션합니다. 이 경우 추가 모드에서 열린 파일입니다. 즉, &1
stdout
현재 사용하는 파일 설명자를 재사용합니다.
Alex MartelliBash 버전에 따라 두 가지 방법이 있습니다.
고전적이고 이식 가능한( Bash pre-4 ) 방법은 다음과 같습니다.
cmd >> outfile 2>&1
Bash 4 로 시작하는 이식 불가능한 방법은 다음과 같습니다.
cmd &>> outfile
( &> outfile
유사)
좋은 코딩 스타일을 위해서는
- 이식성이 문제인지 결정(그런 다음 고전적인 방식 사용)
- Bash pre-4에 대한 이식성이 문제인지 결정하십시오(그런 다음 고전적인 방법을 사용하십시오).
- 어떤 구문을 사용하든 동일한 스크립트 내에서 변경하지 마십시오(혼란!)
스크립트가 이미 #!/bin/sh
시작하는 경우(의도 여부에 관계없이) Bash 4 솔루션과 일반적으로 Bash 관련 코드는 적합하지 않습니다.
또한 Bash 4 &>>
는 구문이 더 짧다는 것을 기억하십시오. 새로운 기능이나 이와 유사한 것을 도입하지 않습니다.
구문은 (다른 리디렉션 구문 옆에) 여기에 설명되어 있습니다: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
TheBonsaiBash에서는 다른 파일에 대한 리디렉션을 명시적으로 지정할 수도 있습니다.
cmd >log.out 2>log_error.out
추가는 다음과 같습니다.
cmd >>log.out 2>>log_error.out
Aaron R.Bash 4( Z 쉘 ( zsh
) 4.3.11 뿐만 아니라):
cmd &>> outfile
바로 사용할 수 있습니다.
A B이것은 잘 작동합니다:
your_command 2>&1 | tee -a file.txt
모든 로그를 file.txt에 저장하고 터미널에 덤프합니다.
Pradeep Goswami이 시도:
You_command 1> output.log 2>&1
&> x.file
사용은 Bash 4에서 작동합니다. 죄송합니다. (
여기에 몇 가지 추가 팁이 있습니다.
0, 1, 2, ..., 9는 bash의 파일 설명자입니다.
0은 표준 입력 , 1은 표준 출력 , 2는 표준 오류를 나타냅니다. 3~9는 기타 임시 사용을 위한 여유 공간입니다.
>
또는 >>
(추가)를 사용하여 다른 파일 설명자 또는 파일로 리디렉션될 수 있습니다.
사용법: < file_descriptor > > < 파일 이름 | 파일 설명자(&file_descriptor) >
20장. I/O 리디렉션 의 참조를 참조하십시오.
Quintus.Zhou또 다른 접근 방식:
&>>
를 사용할 수 없는 이전 버전의 Bash를 사용하는 경우 다음을 수행할 수도 있습니다.
(cmd 2>&1) >> file.txt
cmd >> file.txt 2>&1
의 기존 접근 방식보다 덜 효율적이며 결과적으로 현재 쉘을 수정해야 하는 명령(예: cd
, pushd
)에서는 작동하지 않지만 이 접근 방식은 나에게 더 자연스럽고 이해하기 쉬운 느낌:
- 표준 오류를 표준 출력으로 리디렉션합니다.
- 파일에 추가하여 새 표준 출력을 리디렉션합니다.
또한 괄호는 특히 표준 출력과 표준 오류를 다른 명령으로 파이프하려는 경우 모호한 순서를 제거합니다.
서브쉘을 시작하지 않으려면 괄호 대신 중괄호를 사용하여 그룹 명령 을 생성할 수 있습니다.
{ cmd 2>&1; } >> file.txt
(그룹 명령을 종료하려면 세미콜론(또는 개행)이 필요합니다.)
jamesdlin내부 스크립트에서 리디렉션
스크립트 자체에서 리디렉션을 계획할 수 있습니다.
#!/bin/bash exec 1>>logfile.txt exec 2>&1 /bin/ls -ld /tmp /tnt
이것을 실행하면 다음을 포함하는 logfile.txt
/bin/ls: cannot access '/tnt': No such file or directory drwxrwxrwt 2 root root 4096 Apr 5 11:20 /tmp
다양한 파일에 로그인
하나의 전체 로그에 추가하고 다른 마지막 로그를 다시 만드는 두 개의 다른 로그 파일을 만들 수 있습니다.
#!/bin/bash if [ -e last.log ] ;then mv -f last.log last.old fi exec 1> >(tee -a overall.log /dev/tty >last.log) exec 2>&1 ls -ld /tnt /tmp
이 스크립트를 실행하면
- 경우
last.log
이미 존재하는 이름을 바꿀 last.old
(덮어 쓰기 last.old
존재하는 경우). - 새로운
last.log
. -
overall.log
모든 것을 추가하십시오. - 터미널에 모든 것을 출력합니다.
단순 및 결합 로그
#!/bin/bash [ -e last.err ] && mv -f last.err lasterr.old [ -e last.log ] && mv -f last.log lastlog.old exec 2> >(tee -a overall.err combined.log /dev/tty >last.err) exec 1> >(tee -a overall.log combined.log /dev/tty >last.log) ls -ld /tnt /tmp
그래서 당신은
-
last.log
마지막 실행 로그 파일 -
last.err
마지막 실행 오류 파일 -
lastlog.old
이전 실행 로그 파일 -
lasterr.old
이전 실행 오류 파일 -
overall.log
추가된 전체 로그 파일 - 전반적인 오류 파일이 추가된 전체
overall.err
-
combined.log
전체 오류를 추가하고 결합된 파일을 기록합니다. - 여전히 터미널로 출력
F. Hauri출처 : http:www.stackoverflow.com/questions/876239/how-to-redirect-and-append-both-standard-output-and-standard-error-to-a-file-wit