Câu trả lời:
Vâng, có hai cách. Một là để thiết lập PROMPT_COMMAND
trong .bashrc
, người kia - để lệnh thay bộ trong PS1
cho echo $?
lệnh.
Cách 1:
Từ trang hướng dẫn bash:
PROMPT_COMMAND
If set, the value is executed as a command prior to issuing each primary prompt.
Bất cứ điều gì bạn đặt biến này thành, sẽ được chạy trước khi vẽ dấu nhắc mỗi lần. Bản giới thiệu:
$> PROMPT_COMMAND=" echo 'Last command exited with' \$? 'code' "
Last command exited with 0 code
$> ls /etc/passwd > /dev/null
Last command exited with 0 code
$> ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
Last command exited with 2 code
$>
Lưu ý việc sử dụng \$?
. Để thay đổi vĩnh viễn, hãy lưu nó vào.bashrc
Cách 2
Giả sử PS1
lời nhắc của tôi được đặt như thế này:
PS1='
user@ubuntu:$> '
Nếu tôi muốn chạy một số chương trình mỗi lần lời nhắc này được vẽ lại trên màn hình (tức là sau mỗi lệnh trước đó chạy), tôi sẽ cần sử dụng command substitution $(. . .)
và đặt nó trong lời nhắc như vậy:
PS1=' [ $? ]
user@ubuntu: $> '
Bản giới thiệu:
$> PS1=' [ $? ]
> $>_ '
[ 0 ]
$>_ ls /etc/passwd > /dev/null
[ 0 ]
$>_ ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
[ 2 ]
$>_
Lưu ý rằng tôi chia PS1 của tôi thành hai dòng, trên cùng sẽ có [ exitcode ]
và dưới cùng $> <blank space>'
. Đó là lý do tại sao có >
trước $> '
trên dòng thứ hai (Hàng đầu >
là PS2
dấu nhắc cho các lệnh đa dòng). Ngoài ra, bạn có thể làm một cái gì đó như thế này (chú ý $'...'
cấu trúc):
$> PS1=$'[ $? ] \n$> '
[ 0 ]
$>
PS1
chỉ là văn bản đang được in trước khi nhận ý kiến của người dùng - không có gì hơn thế. Nó không miễn dịch với việc mở rộng tham số và thay thế lệnh, vì vậy bạn có thể đặt bất cứ thứ gì vào $(...)
, ví dụ $( pwd )
và nó sẽ hiển thị ở đó. Tôi đã sử dụng điều đó với một tập lệnh tùy chỉnh để hiển thị năng lượng pin của máy tính xách tay, ví dụ
Một phương pháp mà tôi đã chọn từ Arch Wiki là trap
ERR
. trap
được sử dụng trong Bash để chạy các lệnh khi nhận được tín hiệu hoặc cho một số sự kiện khác. Một ERR
bẫy được chạy bất cứ khi nào dòng lệnh hiện tại chấm dứt với một lỗi - giá trị trả về không phải là 0. (Nếu nó chấm dứt bình thường, giá trị trả về rõ ràng sẽ là 0.)
Ví dụ:
trap 'printf "\ncode %d\n\n" $?' ERR
Sau đó:
$ echo foo
foo
$ false
code 1
$
(Lưu ý: không có thông báo nào sau echo
lệnh chạy thành công - Điều đó có nghĩa là gì khi tôi gõ lệnh và thiết bị đầu cuối không làm gì? )
Mẹo Arch Wiki đã đi trước và tô màu thông điệp, để bạn nhận được một thông điệp màu vàng đáng chú ý:
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
Hiệu ứng:
Trong thực tế, tất cả những gì tôi cần làm là để mắt đến màu vàng code
ở đầu ra để biết một lệnh thất bại.