답변:
이렇게하면 읽을 수 있습니다.
>&2 echo "error"
>&2
파일 디스크립터 # 2를 파일 디스크립터 # 1에 복사합니다. 따라서이 경로 재 지정이 수행 된 후 두 파일 디스크립터는 동일한 파일을 참조합니다. 하나의 파일 디스크립터 # 2는 원래 참조했습니다. 자세한 내용은 Bash Hackers Illustrated Redirection Tutorial을 참조하십시오 .
alias
쉘 스크립트를 사용하는 것에 대해 몰랐다 . 아마 사용하는 것이 더 안전 할 것errcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
작동하지 않습니다. 이와 같은 작업을 수행하려면 마지막 파이프 다음에 어딘가에 리디렉션을 배치해야합니다.errcho(){ echo $@|>&2 pr -To5;}
함수를 정의 할 수 있습니다 :
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; }
echoerr -ne xt
"-ne xt"를 인쇄하지 않습니다. 더 잘 사용하십시오 printf
.
echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
의 경우 별도의 인수로 전송됩니다 공백 echo
으로 그들을을 연결 수단 0x20
의 만 입력이 개 적은 문자까지 outweight 편의를 인용하지의 위험) .
다른 옵션
echo foo >>/dev/stderr
foo
-자체 stderr가 리디렉션 된 경우-예를 들어 foo >foo.log 2>&1
-그 echo foo >/dev/stderr
전에 모든 출력을 클로버합니다. >>
대신 사용해야합니다.echo foo >>/dev/stderr
/dev/fd/2
.
/proc/self/fd/2
. 아래 내 대답을 참조하십시오 :)
아니요, 표준 방법입니다. 오류가 발생하지 않아야합니다.
1>&2
. 우리는 이것이 일어나지 않기를 희망하지만, 우리 모두가 그 장소에 있었을 것이라고 확신합니다.
( echo something 1>&2 ; something else ) > log
-> (echo something; cp some junk 1>&2 ; something else) > log
죄송합니다.
메시지를 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
echo what | /dev/stderr
.
참고 : 나는 오해의 소지가 있거나 모호한 "stderr로 출력하는 에코"질문에 대답하고 있습니다 (이미 OP에 의해 답변 됨).
의도 를 보여주고 원하는 구현을 제공 하는 함수를 사용하십시오 . 예 :
#!/bin/bash
[ -x error_handling ] && . error_handling
filename="foobar.txt"
config_error $filename "invalid value!"
output_xml_error "No such account"
debug_output "Skipping cache"
log_error "Timeout downloading archive"
notify_admin "Out of disk space!"
fatal "failed to open logger!"
그리고 error_handling
존재 :
ADMIN_EMAIL=root@localhost
config_error() { filename="$1"; shift; echo "Config error in $filename: $*" 2>&1; }
output_xml_error() { echo "<error>$*</error>" 2>&1; }
debug_output() { [ "$DEBUG"=="1" ] && echo "DEBUG: $*"; }
log_error() { logger -s "$*"; }
fatal() { which logger >/dev/null && logger -s "FATAL: $*" || echo "FATAL: $*"; exit 100; }
notify_admin() { echo "$*" | mail -s "Error from script" "$ADMIN_EMAIL"; }
OP의 우려를 처리하는 이유 :
다른 이유들:
나의 제안:
echo "my errz" >> /proc/self/fd/2
또는
echo "my errz" >> /dev/stderr
echo "my errz" > /proc/self/fd/2
것이다 효율적으로 출력 stderr
하기 때문에 /proc/self
현재 프로세스에 대한 링크이며, /proc/self/fd
공정 열린 파일 기술자를 보유하고, 0
, 1
,와 2
약자 stdin
, stdout
그리고 stderr
각각.
/proc/self
링크가 맥 OS에서 작동하지 않습니다, 그러나, /proc/self/fd/*
안드로이드에 Termux 볼 수 있지만 /dev/stderr
. Bash 스크립트에서 OS를 감지하는 방법은 무엇입니까? 사용할 변형을 결정하여 스크립트를보다 이식성있게 만들어야하는 경우 도움이 될 수 있습니다.
/proc/self
링크는 MacOS에서는 작동하지 않으므로 더 간단한 /dev/stderr
방법을 사용 하겠습니다 . 또한 다른 답변 / 의견에서 언급했듯이 >>
추가하는 데 사용 하는 것이 좋습니다 .
/proc/self/fd/*
Android의 Termux에서는 사용할 수 있지만에서는 사용할 수 없습니다 /dev/stderr
.
cat
여기에 언급 된대로 사용하지 마십시오 . cat
A는 프로그램
상태 echo
및 printf
(쉘) 내장 매크로 배시이다. 프로그램 또는 다른 스크립트 (위에서 언급 한)를 시작하면 모든 비용으로 새로운 프로세스를 생성 할 수 있습니다. 내장 기능을 사용하면 프로세스 (환경)를 생성 (실행) 할 필요가 없으므로 쓰기 기능이 상당히 저렴합니다.
opner는 "표준 파이프 에 stderr 로 출력하는 표준 도구가 있습니까?"라고 묻습니다. ... rediredcting pipe는 유닉스 (Linux ...)와 bash (sh)와 같은 시스템에서 이러한 개념을 기반으로하는 필수 개념입니다.
나는 이와 같은 표기법으로 리디렉션하는 &2>1
것이 현대 프로그래머에게는 그리 즐겁지는 않지만 오프닝이라는 것에 동의합니다 . Bash는 거대하고 강력한 프로그램을 작성하기위한 것이 아니며 관리자가 적은 키 누름으로 작업하도록 도와줍니다. ;-)
그리고 최소한 라인의 어느 곳에 나 리디렉션을 배치 할 수 있습니다.
$ echo This message >&2 goes to stderr
This message goes to stderr
cat
것과 고양이가 느리기 때문에 고양이를 사용하지 않도록 지시 하는 것에는 차이가 있습니다 . cat이 올바른 선택 인 수많은 유스 케이스가 있으므로 이것이 귀하의 답변에 반대하는 이유입니다.
echo
교체를 요청했습니다 . 을 사용하더라도 cat
bash 리디렉션을 사용해야합니다. 어쨌든. 따라서 cat
여기서 사용하는 것은 전혀 의미가 없습니다 . BTW 나는 cat
하루에 100 번 사용 하지만 오프너가 요구 한 상황에서는 결코 ... 당신이 그것을 얻었습니까?
내가 최근에 우연히 발견 한 다른 옵션은 다음과 같습니다.
{
echo "First error line"
echo "Second error line"
echo "Third error line"
} >&2
이것은 &>2
모든 라인 에 추가 할 필요가 없기 때문에 다중 라인 오류 출력이 오류 발생을 줄이면서 Bash 내장 기능 만 사용합니다 .
cat
다른 유틸리티 를 사용하지 말라고 조언합니다 .
read
stderr에 인쇄하는 쉘 내장 명령이며 리디렉션 트릭을 수행하지 않고 echo처럼 사용할 수 있습니다.
read -t 0.1 -p "This will be sent to stderr"
는 -t 0.1
비활성화는 표준 입력 변수로 한 줄 저장의 기본 기능을 판독하는 시간 제한이다.
스크립트 만들기
#!/bin/sh
echo $* 1>&2
그것이 당신의 도구 일 것입니다.
또는 별도의 파일에 스크립트를 원하지 않으면 기능을 수행하십시오.