history - список только успешно выполненных команд

10

Мне интересно, если есть способ использовать команду истории, но только список команд, которые были выполнены успешно. Кроме того, будет ли способ перечислить те, которые привели к ошибкам?

Я знаю, что каждая команда имеет статус выхода:

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как отдельные команды.

Любая идея о том, что я должен настроить в команде, или как это сделать?

lkisac
источник

Ответы:

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 Как ни странно, он дал #(без кода) без побега. Должна быть какая-то проблема с цитированием.
Муру