모든 명령에 대해 종료 상태를 인쇄하도록 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또는 falseasdasdasd?
혼돈

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.