모든 명령에 대해 종료 상태를 인쇄하도록 bash를 구성하는 방법은 무엇입니까?


12

bash에서 실행되는 모든 명령은 종료 코드와 함께 반환됩니다.

bash 프롬프트에서 명령을 입력 할 때마다 종료 상태를 표시하려고합니다. echo $?

예를 들어, echo "hello";bash 프롬프트에서 실행 하면 출력은 다음과 같아야합니다.

linux@linux$ hello
linux@linux$ 0

unix.stackexchange.com에 질문을 게시하는 것은 어떻 습니까?

감사합니다 @ 프랭크. 그러나이 질문을하는 것도 좋은 장소가 아닙니까?
— ravidixit

PS1 변수의 일부로 인쇄를 시도했지만 아직 이해하지 못하는 이유로 작동하지 않습니다.
— ravidixit

답변:


13

마지막으로 실행 된 명령의 종료 코드는 $?환경 변수에 저장됩니다 . 따라서이 변수를 기본 명령 프롬프트에 추가하면 종료 코드가 항상 인쇄됩니다. 프롬프트는 $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을 참조하십시오 .


나는 그것을 시도했지만 bash를 위해 노력했지만 작동하지 않았다. 작업중인 컴퓨터에 대해 항상 [0]이 표시됩니다.
— ravidixit

bash를 실행 하시겠습니까? 당신은 출력을 복사 할 수 있습니까 readlink /proc/$$/exe? 0 의미없는 오류가 오류를주는 뭔가를 시도 : ^C또는 false나 asdasdasd?
— 혼돈

1
@ chaos PS1은로 PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end")표시되지만 0항상 표시 됩니다. 왜 그런지 알아?
— 최대

1
종료 상태가 0이 아닌 경우에만 종료 상태가 표시되면 좋을 것입니다.
— rubo77

1
@max를 설정할 때 $?이미 확장되어 있기 때문 입니다. 수행 하면 볼 수 있습니다. 작은 따옴표를 사용하거나처럼 이스케이프 처리해야합니다 . 0PS1echo $PS1\$?
— wisbucky

7

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

$

2
그는 0 인 경우에도 종료 상태를 인쇄하려고하기 때문에 OP의 요구 사항을 충족시키지 못하지만 정확히 내가 찾던 것입니다.
— Keith Thompson

2

다음은 간단한 예입니다.

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.


2018 년 1 월부터 감사합니다. 종료 코드가 0이 아닌 경우 종료 코드가있는 일반 프롬프트가 필요합니다. 이는 많은 도움이됩니다.
— SDsolar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.