Проверьте, увеличивался ли номер истории. Отмененная подсказка или подсказка, в которой пользователь только что нажал Enter , не увеличивают номер истории.
Номер истории доступен в переменной HISTCMD
, но недоступен в PROMPT_COMMAND
(потому что то, что вы хотите, это фактически номер истории предыдущей команды; команда, которая выполняет PROMPT_COMMAND
сама не имеет номера истории). Вы можете получить число из вывода fc
.
prompt_command () {
HISTCMD_previous=$(fc -l -1); HISTCMD_previous=${HISTCMD_previous%%$'[\t ]'*}
if [[ -z $HISTCMD_before_last ]]; then
# initial prompt
elif [[ $HISTCMD_before_last = "$HISTCMD_previous" ]]; then
# cancelled prompt
else
# a command was run
fi
HISTCMD_before_last=$HISTCMD_previous
}
PROMPT_COMMAND='prompt_command'
Обратите внимание, что если вы включили сжатие дубликатов в истории ( HISTCONTROL = ignoredups
или HISTCONTROL = erasedups
), это будет ошибочно сообщать о пустой команде после выполнения двух одинаковых команды подряд.
Просто подключите их к своей оболочке:
$ printf 'echo foo\necho bar\n' | bash
foo
bar
Вам даже не нужно трубить, так как вы и так живете опасно; просто запустите свою команду, которая всегда выводит только безопасные команды для выполнения в конструкции расширения подоболочки:
$ $( awk 'BEGIN { print "echo hello" }' )
hello
Для чего-то более сложного, чем простая команда (и простые команды тоже, конечно):
eval "$( awk... )"
Это запустит код в среде текущей оболочки, и, следовательно, код может также установить переменные модификации och в вашей оболочке.
Однако, поскольку вы, очевидно, хотите проанализировать другие файлы с помощью grep
, почему бы не сделать это той же программой awk
?... или с другой программой awk
, которая читает шаблоны и имена файлов?