source

stderr에 출력하는 에코

gigabyte 2023. 4. 9. 21:34
반응형

stderr에 출력하는 에코

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

는 할 수 것을 .echo foo 1>&2하지만 좀 추하고 오류가 발생하기 쉬워요(예: 상황이 바뀌면 편집이 잘못될 가능성이 더 커집니다).

이를 통해 다음을 쉽게 읽을 수 있습니다.

>&2 echo "error"

>&2는 파일 기술자 #2를 파일 기술자 #1에 복사합니다.따라서 이 리다이렉트 실행 후 두 파일 기술자는 같은 파일(원래 참조하고 있던 파일 기술자 #2 )을 참조합니다.상세한 것에 대하여는, 「Bash Hackers Illustated Redirection Tutorial 」를 참조해 주세요.

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

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

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

Camilo Martin의 bash 고유의 제안은 "여기 문자열"을 사용하며, 일반적으로 에코가 삼키는 인수(-n)를 포함하여 여기에 전달되는 모든 문자열을 인쇄합니다.

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

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

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

★★1출력이므로 을 붙일 .>신음

echo This message goes to stderr >&2

가 걱정하는 것 같으니까1>&2 때문에 입력하기 .1!!에! !!!!!!!

다른 옵션

echo foo >>/dev/stderr

아니, 그게 표준적인 방법이야.오류를 일으키면 안 됩니다.

syslog에도 메시지를 기록해도 괜찮다면 not_so_ugly 방법은 다음과 같습니다.

logger -s $msg

-s 옵션은 "시스템 로그뿐만 아니라 표준 오류에도 메시지를 출력합니다."를 의미합니다.

최근에 우연히 발견한 또 다른 옵션은 다음과 같습니다.

    {
        echo "First error line"
        echo "Second error line"
        echo "Third error line"
    } >&2

방법에서는 줄일 수 (Bash를 에 "Bash"를 추가할 필요가 &>2★★★★★★★★★★★★★★★★★★★」

주의: "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에서 문제를 처리하는 이유:

  • 가능한 가장 좋은 구문(추악한 기호 대신 의미 있는 단어)
  • (특히 스크립트를 재사용하는 경우) 에러 발생이 어려워진다.
  • 표준 Bash 툴은 아니지만, 사용자나 회사/조직의 표준 셸 라이브러리가 될 수 있습니다.

기타 이유:

  • clearity - 다른 유지관리자에게 의도를 나타냅니다.
  • speed - 함수가 셸 스크립트보다 빠릅니다.
  • 재사용 가능성 - 함수가 다른 함수를 호출할 수 있습니다.
  • 구성 가능성 - 원래 스크립트를 편집할 필요가 없습니다.
  • debugging - 오류의 원인이 되는 회선을 쉽게 찾을 수 있습니다(특히 대량의 리다이렉트 또는 리다이렉트 출력으로 데들링을 하고 있는 경우).
  • robustness - 함수가 누락되어 스크립트를 편집할 수 없는 경우 동일한 이름의 외부 도구를 사용할 수 있습니다(예를 들어 log_error는 Linux의 logger와 에일리어스 할 수 있습니다).
  • 스위칭 구현 - 라이브러리의 "x" 속성을 삭제하여 외부 도구로 전환할 수 있습니다.
  • 출력에 구애받지 않음 - STDERR 또는 다른 곳으로 전송해도 상관없습니다.
  • 퍼스낼라이징 - 환경변수를 사용하여 동작을 설정할 수 있습니다.

제안:

echo "my errz" >> /proc/self/fd/2

또는

echo "my errz" >> /dev/stderr

echo "my errz" > /proc/self/fd/2 will will will will will to will will 。stderr/proc/self는 현재 또, 「Current Process」는, 「Current Process」의 링크입니다./proc/self/fd하고 있습니다.후, 「」는 「파일 기술자」를 참조해 주세요.0,1 , , , , 입니다.2 stdin,stdout ★★★★★★★★★★★★★★★★★」stderr각각 다음과 같다.

/proc/self MacOS에서는 동작하지 않습니다./proc/self/fd/*할 수 Android에서는 사용할 수 없습니다./dev/stderrBash 스크립트에서 OS를 검출하는 방법는 스크립트를 보다 이식성이 높은 경우에 사용할 변종을 결정함으로써 도움이 됩니다.

마세요cat여기 언급된 바와 같이 cat프로그램이지만echo ★★★★★★★★★★★★★★★★★」printfbash(쉘) 내장입니다.프로그램이나 다른 스크립트(위도 언급)를 기동하는 것은 모든 비용을 들여 새로운 프로세스를 작성하는 것을 의미합니다.빌트인을 사용하면 프로세스(-환경)를 작성(실행)할 필요가 없기 때문에 쓰기 기능이 상당히 저렴합니다.

unix (Linux...)나 bash (sh)와 같은 시스템에서 파이프의 리다이렉트는 이러한 개념을 기반으로 구축되는 기본적인 개념입니다.

합니다.&2>1현대 프로그래머들에게는 그다지 즐겁지 않지만, 그건 바로 bash입니다.견고한 키 를 줄이고 관리자가 할 수 돕기 위한 관리자가 키 누르기를 줄이고 작업을 수행할 수 있도록 하기 위한 것입니다;-)

적어도 리다이렉션은 회선의 임의의 장소에 배치할 수 있습니다.

$ echo This message >&2 goes to stderr 
This message goes to stderr

이것은 파이프 입력을 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

James Roth와 Glenn Jackman이 제안한 통합 솔루션

  • ANSI 색상 코드를 추가하여 오류 메시지를 빨간색으로 표시합니다.
echoerr() { printf "\e[31;1m%s\e[0m\n" "$*" >&2; }

# if somehow \e is not working on your terminal, use \u001b instead
# echoerr() { printf "\u001b[31;1m%s\u001b[0m\n" "$*" >&2; }

echoerr "This error message should be RED"

read는 stderr에 출력되는 셸 내장 명령어로 리다이렉션트릭을 실행하지 않고 에코와 같이 사용할 수 있습니다.

read -t 0.1 -p "This will be sent to stderr"

-t 0.1는 읽기의 주요 기능을 비활성화하는 타임아웃으로 stdin의 한 줄을 변수에 저장합니다.

스크립트를 작성하다

#!/bin/sh
echo $* 1>&2

그게 너의 도구가 될 거야

또는 스크립트를 별도의 파일로 만들지 않으려면 기능을 만드십시오.

마지막 명령어 종료 상태를 체크하여 에러를 표시하고 스크립트를 종료하는 기능입니다.

or_exit() {
    local exit_status=$?
    local message=$*

    if [ "$exit_status" -gt 0 ]
    then
        echo "$(date '+%F %T') [$(basename "$0" .sh)] [ERROR] $message" >&2
        exit "$exit_status"
    fi
}

사용방법:

gzip "$data_dir"
    or_exit "Cannot gzip $data_dir"

rm -rf "$junk"
    or_exit Cannot remove $junk folder

되었을 때 하도록 합니다.crontab에러를 기록합니다.

59 23 * * * /my/backup.sh 2>> /my/error.log

언급URL : https://stackoverflow.com/questions/2990414/echo-that-outputs-to-stderr

반응형