에코처럼 작동하지만 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