bash 디스플레이 stderr 메시지를 붉은 색 으로 만드는 방법이 있습니까?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') } bash와 zsh에 효과적 입니다. 이것을 b / c 평판의 대답으로 추가 할 수 없습니다.
bash 디스플레이 stderr 메시지를 붉은 색 으로 만드는 방법이 있습니까?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') } bash와 zsh에 효과적 입니다. 이것을 b / c 평판의 대답으로 추가 할 수 없습니다.
답변:
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
>&2직전에 추가하면 ; done)stderr에 대한 출력이 실제로 stderr에 기록됩니다. 프로그램의 일반 출력을 캡처하려는 경우에 유용합니다.
tputcommand 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done)
IFS= read -r line도움이되지만 그렇지 않습니다. 이유가 확실하지 않습니다.
방법 1 : 프로세스 대체 사용 :
command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)
방법 2 : bash 스크립트에서 함수를 작성하십시오.
color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1
다음과 같이 사용하십시오.
$ color command
두 방법 모두 명령 stderr을 빨간색으로 표시합니다 .
방법 2의 작동 방식에 대한 설명은 계속 읽으십시오. 이 명령으로 보여주는 몇 가지 흥미로운 기능이 있습니다.
color()... — color라는 bash 함수를 만듭니다.set -o pipefail— 이것은 출력이 다른 명령으로 파이프되는 명령의 오류 리턴 코드를 유지하는 쉘 옵션입니다. 이것은 외부 쉘에서 pipefail 옵션을 변경하지 않도록 괄호로 작성된 서브 쉘에서 수행됩니다. "$@"— 함수에 대한 인수를 새 명령으로 실행합니다. "$@"에 해당"$1" "$2" ...2>&1- 리디렉션 stderr에 명령을 stdout가되도록 sed의 stdin.>&3— 축약 형으로 1>&3, stdout새로운 임시 파일 디스크립터로 리디렉션 됩니다 3. 나중에 3다시 라우팅됩니다 stdout.sed ...- 위의 리디렉션 때문에 sed'들 stdin은 IS stderr실행 된 명령. 그 기능은 각 라인을 컬러 코드로 둘러싸는 것입니다.$'...' 백 슬래시로 이스케이프 된 문자를 이해하도록하는 bash 구성.* — 전체 줄과 일치합니다.\e[31m — 다음 문자가 빨간색이되도록하는 ANSI 이스케이프 시퀀스&— sed일치하는 전체 문자열 (이 경우 전체 줄)로 확장 되는 대체 문자입니다.\e[m — 색상을 재설정하는 ANSI 이스케이프 시퀀스.>&2- 대한 속기 1>&2이 리디렉션 sed의가 stdout에 stderr.3>&1— 임시 파일 디스크립터를 3로 리디렉션합니다 stdout.zsh있습니까?
zsh: color()(set -o pipefail;"$@" 2>&1 1>&3|sed $'s,.*,\e[31m&\e[m,'1>&2)3>&1
stderred를 확인할 수도 있습니다 : https://github.com/sickill/stderred
.bashrc) 사용하는 것이 주저합니다 . 그래도 고마워!
stderr를 영구적으로 빨간색 으로 만드는 bash 방법은 'exec'를 사용하여 스트림을 리디렉션합니다. bashrc에 다음을 추가하십시오.
exec 9>&2
exec 8> >(
while IFS='' read -r line || [ -n "$line" ]; do
echo -e "\033[31m${line}\033[0m"
done
)
function undirect(){ exec 2>&9; }
function redirect(){ exec 2>&8; }
trap "redirect;" DEBUG
PROMPT_COMMAND='undirect;'
나는 이것을 이전에 게시했다 : STDOUT 및 STDERR의 글꼴 색상을 설정하는 방법
source ~/.bashrc두 번 사용하면 터미널이 기본적으로 잠 깁니다.
순수한 배쉬로 Balázs Pozsár의 답변을 구현하는 래퍼 스크립트를 만들었습니다. $ PATH 및 접두사 명령에 저장하여 출력을 채색하십시오.
#! / bin / bash
만약 [$ 1 == "--help"]; 그때
echo "명령을 실행하고 발생한 모든 오류를 채색합니다"
echo "예 :`basename $ {0}`wget ..."
echo "(c) o_O Tync, ICQ # 1227-700, 즐기십시오!"
출구 0
fi
# 모든 오류를 포착하는 임시 파일
TMP_ERRS = $ (mktemp)
# 실행 명령
"$ @"2>> (행을 읽는 동안 echo -e "\ e [01; 31m $ line \ e [0m"| tee --append $ TMP_ERRS; done)
EXIT_CODE = $?
# 모든 오류를 다시 표시
[-s "$ TMP_ERRS"] 인 경우; 그때
echo -e "\ n \ n \ n \ e [01; 31m === 오류 === \ e [0m"
고양이 $ TMP_ERRS
fi
rm -f $ TMP_ERRS
# 마무리
$ EXIT_CODE 종료
이런 기능을 사용할 수 있습니다
#!/bin/sh
color() {
printf '\033[%sm%s\033[m\n' "$@"
# usage color "31;5" "string"
# 0 default
# 5 blink, 1 strong, 4 underlined
# fg: 31 red, 32 green, 33 yellow, 34 blue, 35 purple, 36 cyan, 37 white
# bg: 40 black, 41 red, 44 blue, 45 purple
}
string="Hello world!"
color '31;1' "$string" >&2
stderr에 인쇄하기 위해> & 2를 추가합니다.
O_o Tync 스크립트의 약간 수정 된 버전이 있습니다. OS X Lion 용으로 이러한 모드를 만들어야했는데 랩핑 된 명령이 실행되기 전에 스크립트가 완료되기 때문에 완벽하지 않습니다. 수면을 추가했지만 더 좋은 방법이 있다고 확신합니다.
#!/bin/bash
if [ $1 == "--help" ] ; then
echo "Executes a command and colorizes all errors occured"
echo "Example: `basename ${0}` wget ..."
echo "(c) o_O Tync, ICQ# 1227-700, Enjoy!"
exit 0
fi
# Temp file to catch all errors
TMP_ERRS=`mktemp /tmp/temperr.XXXXXX` || exit 1
# Execute command
"$@" 2> >(while read line; do echo -e "$(tput setaf 1)$line\n" | tee -a $TMP_ERRS; done)
EXIT_CODE=$?
sleep 1
# Display all errors again
if [ -s "$TMP_ERRS" ] ; then
echo -e "\n\n\n$(tput setaf 1) === ERRORS === "
cat $TMP_ERRS
else
echo "No errors collected in $TMP_ERRS"
fi
rm -f $TMP_ERRS
# Finish
exit $EXIT_CODE
이 솔루션은 나를 위해 일했습니다 : https://superuser.com/questions/28869/immediately-tell-which-output-was-sent-to-stderr
이 기능을 내 .bashrc또는 에 넣었습니다 .zshrc.
# Red STDERR
# rse <command string>
function rse()
{
# We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
# Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
((eval $(for phrase in "$@"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}
그런 다음 예를 들면 다음과 같습니다.
$ rse cat non_existing_file.txt
나에게 빨간색 출력을 줄 것이다.
set -o pipefail;이전 (eval에 추가 할 수 있습니다
"인수에 공백을 보존하기 위해 to eval을 추가하십시오
xargs 및 printf 사용 :
command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)