In giá trị trả về sau khi thực hiện chương trình


9

Tôi tự hỏi làm thế nào để thiết lập tùy chọn để tự động in giá trị trả về sau mỗi lần thực hiện chương trình trong thiết bị đầu cuối mà không cần gõ echo $?.

Nó có phải là một cái gì đó có thể được thiết lập? Codeblocks có tính năng đó.

Câu trả lời:


10

Vâng, có hai cách. Một là để thiết lập PROMPT_COMMANDtrong .bashrc, người kia - để lệnh thay bộ trong PS1cho 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ử PS1lờ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 >PS2dấ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 ] 
$> 

+1 Điều đó thực sự hoạt động. Tôi không nghi ngờ bất kỳ ai có danh tiếng 27k, nhưng rõ ràng lời nhắc không phải là "lệnh", vì vậy sử dụng $? trong đó không nhận được $? đặt lại về 0 như tôi nghĩ nó có thể - ngay cả khi sử dụng phương thức đầu tiên thực hiện echo mà không có lỗi.
Joe

PS1chỉ 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ụ
Sergiy Kolodyazhnyy

@mchid có ý gì?
Sergiy Kolodyazhnyy

1
@mchid "Trước khi ban hành từng dấu nhắc chính", do đó sau khi lệnh cuối cùng thực hiện xong.
kos

1
@mchid nó chạy trước khi lời nhắc được in - vì vậy trước khi bạn nhập lệnh tiếp theo.
muru

4

Một phương pháp mà tôi đã chọn từ Arch Wikitrap 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 ERRbẫ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 echolệ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:

nhập mô tả hình ảnh ở đây

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.