csh에서 stderr 리디렉션이 작동하지 않습니다 2> output.log 출력은 여전히 ​​터미널에 표시됩니다.

다음 명령을 실행합니다.

pkg_add emacs-23.4,2.tbz 2> output.log

출력은 여전히 ​​터미널에 표시됩니다. 나는 누르면 , 내가 얻을

pkg_add emacs-23.4,2.tbz 2 > output.log

앞에 공백이2 있습니다.

원래 이것을 넣지 않았습니다. 나는 노력한다

pkg_add emacs-23.4,2.tbz > output.log 2>&1

나는 누르면 다시 , 공간이 추가되었습니다 .

왜 이런 일이 발생합니까?

FreeBSD에서 csh를 실행하고 있습니다.



답변

2> 리디렉션은 csh 또는 tcsh에서 작동하지 않습니다.

스타일 재 지정을 사용하려면 chsh명령을 사용하여 쉘을 / bin / sh 또는 / usr / local / bin / bash로 2>변경하십시오. 참고 : 루트 쉘을 / usr / local / bin / bash로 변경하지 마십시오

csh와 tcsh는 표준 출력과 오류를 개별적으로 리디렉션 할 수 없지만 >&결합 된 출력을 파일로 리디렉션합니다.


답변

STDERR을 숨기거나 STDOUT으로 리디렉션하려고하는지 잘 모르겠습니다.

STDOUT을 파일로 경로 재 지정하려면 다음을 수행하십시오.

pkg_add emacs-23.4,2.tbz > stdout.log

STDOUT 및 STDERR을 파일로 경로 재 지정하려면 다음을 수행하십시오.

pkg_add emacs-23.4,2.tbz > & stdxxx.log

STDOUT을 파일로 리디렉션하고 STDERR을 숨기려면 다음을 수행하십시오.

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

STDOUT을 콘솔로 리디렉션하고 STDERR을 숨기려면 다음을 수행하십시오.

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

STDOUT을 콘솔로 리디렉션하고 STDERR을 파일로 리디렉션하려면 :

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

STDOUT을 파일로 리디렉션하고 STDERR을 파일로 리디렉션하려면

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

편집 : 이것이 작동하는 이유는 ()의 동작이 먼저 발생하기 때문입니다. Ergo, STDOUT을 리디렉션하면 더 이상 () 외부에서 사용할 수 없습니다. STDERR 만 남긴 다음 원하는대로 리디렉션 할 수 있습니다.


답변

Csh에서 수행하는 방법을 알고 있지만 2 개의 셸을 사용합니다.

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

이러한 방법으로 stdout없이 stderr file.txt 로 리디렉션 할 수 있습니다 .