history - แสดงรายการคำสั่งที่รันเรียบร้อยแล้วเท่านั้น


10

ฉันสงสัยว่ามีวิธีใช้คำสั่งhistory หรือไม่แต่แสดงรายการคำสั่งที่รันได้สำเร็จเท่านั้น ในทำนองเดียวกันจะมีวิธีแสดงรายการข้อผิดพลาดที่เกิดขึ้นหรือไม่?

ฉันรู้ว่าแต่ละคำสั่งมีสถานะการออกเป็น:

0- การดำเนินการคำสั่งสำเร็จ
1- คำสั่งล้มเหลวเนื่องจากข้อผิดพลาดระหว่างการขยายหรือเปลี่ยนเส้นทางสถานะการออกมากกว่าศูนย์
2- การใช้คำสั่งไม่ถูกต้อง
12- พบคำสั่ง แต่ไม่สามารถใช้งานได้
127- ไม่พบคำสั่ง

และสามารถตรวจสอบการดำเนินการคำสั่งด้วยecho $?
จาก: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

ตัวอย่าง:

หลังจากรันคำสั่ง 4 เหล่านี้:

ls
help
lss
ls nonexistentfile

ฉันพยายามทดสอบเพื่อพิมพ์คำสั่งที่ประสบความสำเร็จเท่านั้น (สถานะออกจาก 0) ซึ่งควรเป็น 'ls' และ 'ช่วย' เท่านั้น:

for j in `history | tail -5 | head -4 | cut -d ' ' -f5-`; do $j > cmd_out; if [[ `echo $?` != 0 ]]; then :; else echo $j | grep -v 'bash'; fi; done; rm cmd_out

ผลลัพธ์นี้:

ls
help
bash: lss: command not found
ls
bash: nonexistentfile.txt: command not found

วิธีนี้ใช้งานได้ แต่มีสองปัญหา:

  1. ด้วยเหตุผลบางอย่างgrep -v 'bash'ไม่รวมบรรทัดที่มี 'bash' แต่ถ้าฉันทำgrep 'bash'มันจะรวมเฉพาะบรรทัดที่มี 'bash' เท่านั้นฉันไม่แน่ใจว่าทำไมสายหนึ่งถึงใช้งานได้
  2. มันแยกแต่ละบรรทัด / คำสั่งด้วยสตริง lsคำสั่งสุดท้ายควรเป็น
    ls nonexistentfileแต่มันกำลังทำงานlsและnonexistentfileเป็นคำสั่งแยกต่างหาก

ความคิดเกี่ยวกับสิ่งที่ฉันควรปรับในคำสั่งหรือวิธีการเกี่ยวกับการทำเช่นนี้?

คำตอบ:


4

นี่คือแฮ็คที่ฉันใช้หนึ่งครั้งในบัญชีที่ใช้ร่วมกันเพื่อติดตามว่าใครทำอะไร:

PROMPT_COMMAND="history -a; sed -i '\$s/\$/ \#$NAME/' $HISTFILE; history -r; $PROMPT_COMMAND"

มันเขียนhistoryก่อนที่PROMPTจะปรากฏขึ้น: มีผลบังคับใช้หลังจากแต่ละคำสั่ง คุณสามารถแก้ไขสิ่งนี้เพื่อใช้บันทึกรหัสออกในประวัติ:

PROMPT_COMMAND="CODE=$?; history -a; sed -i '\$s/\$/ \#\$CODE/' $HISTFILE; history -r; $PROMPT_COMMAND"

สิ่งนี้จะปล่อยให้รายการในประวัติของคุณเช่น:

$ history 2
 1271  vim .bashrc #0
 1272  history 2

(รายการสุดท้ายจะได้รับการปรับปรุงหลังจากhistoryออกคำสั่งเพื่อให้รหัสทางออกไม่สามารถมองเห็นในการส่งออกนี้.)

นี่เป็นเอฟเฟกต์ที่น่ารำคาญที่ประวัติในพรอมต์ของคุณจะมีความคิดเห็น:

$ # press up
$ history 2 #0

ความคิดเห็นไม่ส่งผลกระทบต่อการดำเนินการหรือการส่งออกโดยปกติ แต่ทำการแก้ไขความเจ็บปวด

ตอนนี้คุณสามารถgrepประวัติเพื่อดูรหัสที่ออกเรียบร้อยแล้ว:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.

ฉันลองทั้งบน Mobaxterm และ Putty และรับls #$CODE, ll #$CODEเอาท์พุทประวัติศาสตร์ ผมไม่แน่ใจว่าการทำงานสำหรับคุณ แต่ฉันมีการเปลี่ยนแปลงไปsed -i '\$s/\$/ \#\$CODE/' $HISTFILE' sed -i '\$s/\$/ \#$CODE/' $HISTFILEฉันเอา `` ออกก่อน $ CODE
lkisac

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