lịch sử - Danh sách chỉ chạy thành công lệnh


10

Tôi tự hỏi nếu có một cách để sử dụng lệnh lịch sử nhưng chỉ liệt kê các lệnh đã được chạy thành công. Tương tự như vậy, liệu có cách nào để liệt kê những lỗi tạo ra lỗi không?

Tôi biết mỗi lệnh có trạng thái thoát là:

0- Thực hiện thành công lệnh
1- Lệnh thất bại do lỗi trong quá trình mở rộng hoặc chuyển hướng, trạng thái thoát lớn hơn 0.
2- Sử dụng lệnh không chính xác
12- Tìm thấy lệnh nhưng không thể thực thi
127- Không tìm thấy lệnh

và có thể được kiểm tra tiến hành lệnh với echo $?
từ: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

Thí dụ:

Sau khi chạy 4 lệnh này:

ls
help
lss
ls nonexistentfile

Tôi đã thử kiểm tra để chỉ in các lệnh thành công (trạng thái thoát là 0), chỉ nên 'ls' và 'help':

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

Kết quả này:

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

Điều này hơi hoạt động, nhưng có hai vấn đề:

  1. Vì một số lý do, grep -v 'bash'không loại trừ các dòng có chứa 'bash', nhưng nếu tôi làm vậy grep 'bash', nó sẽ chỉ bao gồm các dòng có 'bash', tôi không chắc tại sao một dòng hoạt động mà không phải là dòng khác.
  2. Đó là phân tách từng dòng / lệnh bằng chuỗi. Lệnh cuối cùng lssẽ là
    ls nonexistentfile, nhưng nó đang chạy lsnonexistentfilelà các lệnh riêng biệt.

Bất kỳ ý tưởng về những gì tôi nên điều chỉnh trong lệnh, hoặc làm thế nào để làm điều này?

Câu trả lời:


4

Đây là một hack tôi đã sử dụng một lần trên tài khoản được chia sẻ để theo dõi ai đã làm gì:

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

Nó viết historytrước khi PROMPTđược hiển thị: có hiệu lực, sau mỗi lệnh. Bạn có thể sửa đổi điều này để sử dụng lưu mã thoát trong lịch sử:

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

Điều này sẽ để lại các mục trong lịch sử của bạn như:

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

(Các mục cuối cùng sẽ được cập nhật, sau khi các historylối ra lệnh, vì vậy mã thoát là không hiển thị trong kết quả này.)

Điều này có tác dụng gây khó chịu mà lịch sử trong lời nhắc của bạn sẽ có nhận xét:

$ # press up
$ history 2 #0

Nhận xét không ảnh hưởng đến việc thực thi hoặc đầu ra thường, nhưng làm cho việc chỉnh sửa trở nên khó khăn.

Bây giờ bạn có thể greplịch sử của mình để xem mã nào đã thoát thành công:

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

Tôi đã thử nó trên cả Mobaxterm và Putty và nhận được ls #$CODE, ll #$CODEkết quả lịch sử. Tôi không chắc nó có hiệu quả với bạn không, nhưng tôi phải đổi sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'sang sed -i '\$s/\$/ \#$CODE/' $HISTFILE. Tôi đã lấy `` ra trước $ CODE
lkisac

@lkisac Oddly đối với tôi, nó đã cho #(không có mã) mà không có lối thoát. Phải là một số vấn đề trích dẫn.
muru
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.