csh에서 stderr 리디렉션이 작동하지 않습니다


11

다음 명령을 실행합니다.

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를 실행하고 있습니다.

답변:


12

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

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

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


+1과 ✔. 을 사용하여 쉘을 변경했습니다 sh.
gadgetmo

1
@Craig 그는 pkg_addFreeBSD 에서 실행 중이므로 이것이 루트 사용자를위한 것이라고 가정합니다 (/ bin / csh는 FreeBSD의 루트에 대한 기본값입니다). 이 경우 쉘을 / usr / local / bin / bash로 변경 해서는 안됩니다 . / bin / sh가 허용됩니다. 루트로 로그인 한 후 다른 쉘로 전환 할 수도 있습니다.
James O'Gorman

@ JamesO'Gorman Good catch 내 답변을 업데이트했습니다.
Craig

20

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 만 남긴 다음 원하는대로 리디렉션 할 수 있습니다.


@nikc 님, unix.SE에 오신 것을 환영합니다. 귀하의 의견은 유용하고 유익합니다. 답을 편집하고 바로 거기에 포함시켜 놓치기가 쉽지 않습니다.
drs

1

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.