Каждая команда, которую я набираю на bash, возвращается с кодом выхода.
Я хочу:
Всякий раз, когда я набираю команду в приглашении bash, я хочу, чтобы она выходила и печатала состояние выхода, т.е.
например. если я запускаю 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
Иначе то, что я выбрал от Дуги, 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 >
Еще лучший путь состоит в том, чтобы только распечатать код выхода, когда это является ненулевым.
PS1='${?#0}> ' # single quote example
PS1="\${?#0}> " # double quote example (requires extra backslash)
Демонстрационный вывод:
> echo 'ok'
ok
> bogus
bogus: command not found
127>
Объяснение: ${var#pattern}
расширение параметра удара, которое средства удаляют самый короткий шаблон соответствия из передней стороны $var. Так в этом случае мы удаляем 0
от передней стороны $?
, который эффективно усек бы код выхода 0
.
При использовании двойных кавычек, $?
был бы заменен когда PS1
установлен, вместо того, чтобы быть оцененным каждый раз. Сделать echo $PS1
для подтверждения Вас не имеют значения hardcoded в PS1
.