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

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

다음 명령을 실행합니다.

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

답변1

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

편집: 이것이 작동하는 이유는 ()의 작업이 먼저 발생하기 때문입니다. 따라서 STDOUT을 리디렉션한 경우 () 외부에서는 더 이상 사용할 수 없습니다. 그러면 STDERR만 남게 되고 원하는 대로 리디렉션할 수 있습니다.

답변2

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

chsh스타일 리디렉션 을 사용하려면 명령을 사용하여 셸을 /bin/sh 또는 /usr/local/bin/bash로 변경하세요 2>.메모:루트의 쉘을 /usr/local/bin/bash로 변경하지 마십시오.

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

답변3

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

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

이러한 방법을 사용하면 리디렉션이 가능합니다.오직stdout 없이 stderr를 file.txt로 변환 - 즉 원하는 것입니다.

답변4

nikc의 답변과 관련하여 Bourne 쉘과 동일한 동작을 달성하려면 대신 /dev/ttyFIFO를 사용하십시오.

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

mkfifo stdout
( pkg install -y emacs > stdout ) >& /dev/null & cat stdout

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

pkg install -y emacs > /dev/null

관련 정보