Як налаштувати bash для друку статусу виходу для кожної команди?


12

Кожна команда, виконана в bash, повертається з кодом виходу.

Щоразу, коли я набираю команду на bash prompt, я хочу, щоб вона відображала статус виходу, тобто echo $?

наприклад, якщо я запускаю echo "hello";підказку bash, вихід повинен бути:

linux@linux$ hello
linux@linux$ 0

Що щодо публікації запитання на unix.stackexchange.com ?

Дякую @Frank Але хіба це також не гарне місце, щоб поставити це питання?
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


Я намагався робити це, але для басу під рукою, його не працює. це завжди показує [0] для машини, над якою я працюю.
ravidixit

Ви впевнені, що керуєте басом? Чи можете ви скопіювати вихід, 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 Це тому, що ваш файл $?уже розширено під 0час налаштування PS1. Зробіть echo $PS1і побачите. Вам доведеться або використовувати окремі цитати, або уникати подібних \$?.
wisbucky

7

Ще один спосіб, який я вибрав з Arch Wikitrap : використовувати :

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
Це не зовсім відповідає вимогам ОП, оскільки він хоче надрукувати статус виходу, навіть якщо він дорівнює нулю - але це саме те , що я шукав.
Кіт Томпсон

2

Ось простий приклад:

PS1='$? > '

Якщо ви використовуєте подвійні лапки, вам слід додати зворотній косу рису, щоб уникнути $:

PS1="\$? > "

Вихід:

0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 > 

Ще кращий спосіб - друкувати вихідний код лише тоді, коли він не дорівнює нулю.

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 року. Я хочу, щоб нормальне запит із кодом виходу на початку, якщо він не є нульовим - це дуже допомагає.
SDsolar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.