bash에서 실행되는 모든 명령은 종료 코드와 함께 반환됩니다.
bash 프롬프트에서 명령을 입력 할 때마다 종료 상태를 표시하려고합니다. echo $?
예를 들어, echo "hello";bash 프롬프트에서 실행 하면 출력은 다음과 같아야합니다.
linux@linux$ hello
linux@linux$ 0
bash에서 실행되는 모든 명령은 종료 코드와 함께 반환됩니다.
bash 프롬프트에서 명령을 입력 할 때마다 종료 상태를 표시하려고합니다. echo $?
예를 들어, echo "hello";bash 프롬프트에서 실행 하면 출력은 다음과 같아야합니다.
linux@linux$ hello
linux@linux$ 0
답변:
마지막으로 실행 된 명령의 종료 코드는 $?환경 변수에 저장됩니다 . 따라서이 변수를 기본 명령 프롬프트에 추가하면 종료 코드가 항상 인쇄됩니다. 프롬프트는 $PS1환경 변수에 저장됩니다 . 처음에 /etc/bash.bashrc스크립트 에서 설정 하고 나중에에서 설정합니다 $HOME/.bashrc.
따라서 기본값에서 라인을 편집하십시오 $HOME/.bashrc( /etc/bash.bashrc시스템 전체 일 것입니다).
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
이것에 (예를 들어) :
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] \$ '
따라서 기본 프롬프트가 다음으로 변경되었습니다.
user@host:/path/to/dir[0] $
괄호 안의 0은 종료 코드입니다.
user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $
의미는 http://www.tldp.org/LDP/abs/html/exitcodes.html을 참조하십시오 .
readlink /proc/$$/exe? 0 의미없는 오류가 오류를주는 뭔가를 시도 : ^C또는 false나 asdasdasd?
PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end")표시되지만 0항상 표시 됩니다. 왜 그런지 알아?
$?이미 확장되어 있기 때문 입니다. 수행 하면 볼 수 있습니다. 작은 따옴표를 사용하거나처럼 이스케이프 처리해야합니다 . 0PS1echo $PS1\$?
Arch Wiki 에서 고른 또 다른 방법 은 다음을 사용하는 것입니다 trap.
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
효과:
$ ( exit 1 )
code 1
$ some-non-existent-command
some-non-existent-command: command not found
code 127
$
다음은 간단한 예입니다.
PS1='$? > '
큰 따옴표를 사용하는 경우 백 슬래시를 추가하여 $:
PS1="\$? > "
산출:
0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 >
더 좋은 방법은 종료 코드가 0이 아닌 경우에만 인쇄하는 것입니다.
PS1='${?#0}> ' # single quote example
PS1="\${?#0}> " # double quote example (requires extra backslash)
샘플 출력 :
> echo 'ok'
ok
> bogus
bogus: command not found
127>
설명 : ${var#pattern}bash 매개 변수 확장으로 $ var 앞에서 가장 짧은 일치 패턴을 제거합니다. 따라서이 경우, 0앞에서 $?종료 코드를 효과적으로 잘라내는 앞에서 제거 하고 0있습니다.
큰 따옴표를 사용하는 경우 매번 평가하는 대신 설정 $?될 때 대체됩니다 PS1. 마십시오 echo $PS1당신의 하드 코드 된 값이없는 확인합니다 PS1.