riwayat - Daftar hanya berhasil menjalankan perintah

10

Saya bertanya-tanya apakah ada cara untuk menggunakan perintah sejarah tetapi hanya daftar perintah yang berhasil dijalankan. Demikian juga, akankah ada cara untuk membuat daftar yang menghasilkan kesalahan?

Saya tahu setiap perintah memiliki status keluar dari:

0- Eksekusi perintah berhasil
1- Perintah gagal karena kesalahan selama ekspansi atau redirection, status keluar lebih besar dari nol.
2- Penggunaan perintah salah
12- Perintah ditemukan tetapi tidak dapat dieksekusi
127- Perintah tidak ditemukan

dan dapat diperiksa melanjutkan perintah dengan echo $?
dari: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

Contoh:

Setelah menjalankan 4 perintah ini:

ls
help
lss
ls nonexistentfile

Saya mencoba menguji untuk mencetak hanya perintah yang berhasil (status keluar dari 0), yang seharusnya hanya 'ls' dan '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

Output ini:

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

Ini agak berhasil, tetapi ada dua masalah:

  1. Untuk beberapa alasan, grep -v 'bash'tidak mengecualikan baris yang berisi 'bash', tetapi jika saya lakukan grep 'bash', itu hanya akan menyertakan baris dengan 'bash', saya tidak yakin mengapa satu berfungsi dan tidak yang lain.
  2. Ini memisahkan setiap baris / perintah dengan string. lsPerintah terakhir seharusnya
    ls nonexistentfile, tetapi itu berjalan lsdan nonexistentfilesebagai perintah yang terpisah.

Adakah gagasan tentang apa yang harus saya sesuaikan dalam perintah, atau bagaimana cara melakukannya?

lkisac
sumber

Jawaban:

4

Ini adalah retas yang saya gunakan sekali pada akun bersama untuk melacak siapa yang melakukan apa:

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

Itu menulis historysebelum PROMPTditampilkan: pada dasarnya, setelah setiap perintah. Anda dapat memodifikasi ini untuk menggunakan simpan kode keluar di riwayat:

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

Ini akan meninggalkan entri dalam riwayat Anda seperti:

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

(Entri terakhir akan diperbarui, setelah itu historykeluar perintah, sehingga kode keluar tidak terlihat dalam output ini.)

Ini memiliki efek yang menjengkelkan bahwa riwayat di prompt Anda akan memiliki komentar:

$ # press up
$ history 2 #0

Komentar biasanya tidak memengaruhi eksekusi atau keluaran, tetapi membuat pengeditan menjadi sulit.

Sekarang Anda dapat grepriwayat Anda untuk melihat kode mana yang berhasil keluar:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.
muru
sumber
Saya mencobanya di Mobaxterm dan Putty, dan mendapatkan ls #$CODE, ll #$CODEuntuk keluaran sejarah. Saya tidak yakin jika bekerja untuk Anda, tapi saya harus mengubah sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'ke sed -i '\$s/\$/ \#$CODE/' $HISTFILE. Saya mengambil `` out sebelum $ CODE
lkisac
@ lkisac Anehnya bagi saya, itu memberi #(tanpa kode) tanpa melarikan diri. Pasti ada masalah mengutip.
muru