історія - Список лише успішно запускаються команд


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" та "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

Цей результат:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.