พิมพ์ค่าส่งคืนหลังจากการทำงานของโปรแกรม


9

ผมสงสัยว่าวิธีการตั้งค่าตัวเลือกในการพิมพ์ค่าตอบแทนอัตโนมัติหลังจากการดำเนินการทุกโปรแกรมใน terminal echo $?โดยไม่ต้องพิมพ์

เป็นสิ่งที่สามารถตั้งค่าได้หรือไม่? Codeblocks มีคุณสมบัติดังกล่าว

คำตอบ:


10

ใช่มีสองวิธี หนึ่งคือการตั้งค่าPROMPT_COMMANDใน.bashrcอื่น ๆ - การตั้งค่าการทดแทนคำสั่งPS1สำหรับecho $?คำสั่ง

วิธีที่ 1:

จากหน้าคู่มือทุบตี:

PROMPT_COMMAND

      If set, the value is executed as a command prior to issuing each
      primary prompt.

สิ่งที่คุณตั้งค่าตัวแปรนี้เป็นจะถูกเรียกใช้ก่อนที่จะวาดพรอมต์ในแต่ละครั้ง การสาธิต:

$> 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
$> 

\$?หมายเหตุการใช้งานของ สำหรับการเปลี่ยนแปลงถาวรให้บันทึกไว้.bashrc

วิธีที่ 2

สมมติว่าPS1พรอมต์ของฉันถูกตั้งค่าเช่นนี้:

PS1='
user@ubuntu:$> '

ถ้าฉันต้องการเรียกใช้บางโปรแกรมในแต่ละครั้งที่พรอมต์นี้ปรากฏขึ้นมาใหม่บนหน้าจอ (ซึ่งเป็นหลังจากที่คำสั่งก่อนหน้านี้รัน) ฉันจะต้องใช้command substitution $(. . .) และตั้งค่าในพรอมต์ดังนี้:

PS1=' [ $? ] 
user@ubuntu: $> '

การสาธิต:

$> PS1=' [ $? ]
> $>_ '
 [ 0 ]
$>_ ls /etc/passwd > /dev/null
 [ 0 ]
$>_ ls /etc/asdf > /dev/null                                                                                                      
ls: cannot access /etc/asdf: No such file or directory
 [ 2 ]
$>_ 

แจ้งให้ทราบว่าผมแยก PS1 ของฉันเป็นสองบรรทัดด้านบนจะมีและด้านล่าง[ exitcode ] $> <blank space>'นั่นคือเหตุผลที่มี>มาก่อน$> 'ในบรรทัดที่สอง (ชั้นนำ>เป็นPS2พรอมต์คำสั่งหลาย) อีกวิธีหนึ่งคุณสามารถทำสิ่งนี้ (สังเกต$'...'โครงสร้าง):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 

+1 ใช้งานได้จริง ฉันไม่ได้สงสัยใครที่มีชื่อเสียง 27k แต่เห็นได้ชัดว่าพรอมต์ไม่ใช่ "คำสั่ง" ดังนั้นใช้ $ หรือไม่ ในนั้นไม่ได้รับ $? รีเซ็ตเป็นศูนย์เหมือนฉันคิดว่ามันอาจจะ - แม้ใช้วิธีแรกที่รัน echo โดยไม่มีข้อผิดพลาด
Joe

PS1เป็นเพียงข้อความที่ถูกพิมพ์ก่อนการป้อนข้อมูลผู้ใช้ - ไม่มีอะไรมากไปกว่านั้น มันไม่ได้มีภูมิคุ้มกันต่อการขยายตัวพารามิเตอร์และคำสั่งการแทนเพื่อให้คุณสามารถใส่อะไรเข้าไปใน$(...)ตัวอย่างเช่น$( pwd )และมันจะแสดงที่นั่น ฉันเคยใช้สคริปต์ที่กำหนดเองเพื่อแสดงพลังงานแบตเตอรี่แล็ปท็อปเช่น
Sergiy Kolodyazhnyy

@mchid คุณหมายถึงอะไร
Sergiy Kolodyazhnyy

1
@mchid "ก่อนออกแต่ละพรอมต์หลัก" ดังนั้นหลังจากคำสั่งสุดท้ายดำเนินการเสร็จสิ้น
kos

1
@mchid มันทำงานก่อนที่พรอมต์จะถูกพิมพ์ - ดังนั้นก่อนที่คุณจะพิมพ์คำสั่งต่อไป
muru

4

วิธีการที่ผมหยิบมาจากซุ้มประตูวิกิพีเดียtrap ERRคือการ trapใช้ใน Bash เพื่อรันคำสั่งเมื่อได้รับสัญญาณหรือสำหรับเหตุการณ์อื่น ๆ ERRดักวิ่งเมื่อสิ้นสุดบรรทัดคำสั่งในปัจจุบันมีข้อผิดพลาด - ค่าตอบแทนไม่ได้เป็น 0. (ถ้ามันไม่ยุติตามปกติค่าส่งกลับเห็นได้ชัดจะเป็น 0)

ตัวอย่างเช่น:

trap 'printf "\ncode %d\n\n" $?' ERR

แล้ว:

$ echo foo
foo
$ false

code 1

$

(หมายเหตุ: ไม่มีข้อความหลังจากechoคำสั่งที่รันเสร็จ - หมายความว่าเมื่อฉันพิมพ์คำสั่งและเทอร์มินัลไม่ทำอะไรเลย )

เคล็ดลับ Arch Wiki ดำเนินต่อไปและทำให้ข้อความเป็นสีเพื่อให้คุณได้รับข้อความสีเหลืองที่เห็นได้ชัดเจน:

EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR

ผลกระทบ:

ป้อนคำอธิบายรูปภาพที่นี่

ผลที่ได้คือสิ่งที่ฉันต้องทำคือจับตาดูสีเหลืองcodeในเอาท์พุทเพื่อรู้ว่าคำสั่งล้มเหลว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.