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

이렇게 하면 리디렉션이 허용됩니다.오직stderr를 file.txt로, stdout을 사용하지 않음 - 그것이 바로 당신이 원하는 것입니다.

답변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

관련 정보