[bash] stderr로 출력하는 에코

에코처럼 작동하지만 stdout이 아닌 stderr로 출력되는 표준 Bash 도구가 있습니까?

나는 할 수 있다는 것을 알고 echo foo 1>&2있지만 그것은 추악하고 오류가 발생하기 쉽다고 생각합니다 (예 : 상황이 바뀌면 잘못 편집 될 가능성이 높습니다).



답변

이렇게하면 읽을 수 있습니다.

>&2 echo "error"

>&2파일 디스크립터 # 2를 파일 디스크립터 # 1에 복사합니다. 따라서이 경로 재 지정이 수행 된 후 두 파일 디스크립터는 동일한 파일을 참조합니다. 하나의 파일 디스크립터 # 2는 원래 참조했습니다. 자세한 내용은 Bash Hackers Illustrated Redirection Tutorial을 참조하십시오 .


답변

함수를 정의 할 수 있습니다 :

echoerr() { echo "$@" 1>&2; }
echoerr hello world

이것은 스크립트보다 빠르며 종속성이 없습니다.

Camilo Martin의 bash 특정 제안은 “here string”을 사용하며 echo가 정상적으로 삼키는 인수 (-n)를 포함하여 전달하는 모든 것을 인쇄합니다.

echoerr() { cat <<< "$@" 1>&2; }

Glenn Jackman의 솔루션은 또한 논쟁 삼키는 문제를 피합니다.

echoerr() { printf "%s\n" "$*" >&2; }


답변

1표준 출력 이므로 출력 리디렉션 앞에 명시 적으로 이름을 지정할 필요는 >없지만 대신 다음 과 같이 입력 할 수 있습니다.

echo이 메시지는 stderr> & 2로 이동합니다

1>&2신뢰할 수있는 타이핑이 어려워 질 까봐 걱정되는 것처럼 보이므로 중복을 제거 1하는 것은 약간의 격려가 될 수 있습니다!


답변

다른 옵션

echo foo >>/dev/stderr


답변

아니요, 표준 방법입니다. 오류가 발생하지 않아야합니다.


답변

메시지를 syslog에도 기록하지 않아도되는 경우 not_so_ugly 방법은 다음과 같습니다.

logger -s $msg

-s 옵션은 “메시지를 표준 오류 및 시스템 로그에 출력합니다”를 의미합니다.


답변

파이프 입력을 STDERR로 경로 재지 정하는 간단한 STDERR 함수입니다.

#!/bin/bash
# *************************************************************
# This function redirect the pipe input to STDERR.
#
# @param stream
# @return string
#
function STDERR () {

cat - 1>&2

}

# remove the directory /bubu
if rm /bubu 2>/dev/null; then
    echo "Bubu is gone."
else
    echo "Has anyone seen Bubu?" | STDERR
fi


# run the bubu.sh and redirect you output
tux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err