У меня была проблема, что я хотел записать текущий history
в файл , но все же хотел, чтобы записи записывались в основной bashhistory
Я решил эту проблему, просто прикрепив файл сcat
:
history -a current-history
cat current-history >>.bash_history
В интерактивных оболочках по умолчанию!
используется для расширения истории :оболочка будет искать команду, соответствующую тексту, следующему за !
, и выполнять ее. Как указано в , этот ответ на не может использовать восклицательный знак (! )в Баше? оболочки позволяют отключить расширение истории:
set +H
set -K
Если вы никогда не хотите использовать расширение истории, управляемое восклицательными знаками, вы можете добавить их в сценарии запуска вашей оболочки.
Это не приведет к игнорированию !
, но позволит избежать выполнения команд из вашей истории. !command
будет жаловаться, что !command
не существует.
Эти настройки не влияют на сценарии оболочки, они получают собственные оболочки с не -интерактивной конфигурацией (, которая по умолчанию не включает расширение истории ).
Если вы никогда не используете ! с терминала, вы можете назначить его функции, которую вы никогда не используете, например (в моем случае )werase:
stty werase !
Затем всякий раз, когда вы набираете !, предыдущее слово просто стирается. Если вы когда-либо вводите его только в начале команды терминала, это просто не будет иметь никакого эффекта.
Если вам когда-нибудь понадобится настоящий восклицательный знак, вы все равно можете ввести его, поставив перед ним CTRL -V (или любой другой символ lnext
), чтобы заключить его в кавычки или экранировать.
Если вы обычно не используете функциональность lnext
, вам может оказаться удобнее переопределить lnext
на !
; это позволит вам ввести восклицательный знак, введя его дважды (, первый из которых цитирует второй ).
stty lnext !
Более подробное объяснение того, как это работает:
Функциональность lnext
заключается в следующем :«не интерпретировать следующий символ как что-то особенное :, просто принять символ в качестве ввода таким, какой он есть». Если это специальный символ stty,тогда не применяйте эту специальную функциональность, а просто используйте персонажа как такового. Сюда входит символ, назначенный функции lnext
.
Символом lnext
по умолчанию является CTRL -V (мнемоника :«дословно», как и в :введите следующий символ дословно ). Здесь мы вместо этого переназначаем эту функцию символу !
.
lnext
выбран в первую очередь потому, что в большинстве случаев он не действует (, например, когда следующий введенный символ является обычным символом ). Когда вы случайно набираете !
в начале строки, следующий символ почти всегда является обычным символом без каких-либо специальных действий, поэтому цитирование/экранирование его (явно рассматривается как обычный символ )не наносит вреда. Когда мы пишем a
после !
, значение меняется с «написать a
» на более конкретное значение, которое делает то же самое. :"напишите a
, игнорируйте все остальное, просто сделайте это!"
Если мы хотим создать реальный символ !
, мы можем использовать эту функцию lnext
, чтобы заключить его в кавычки. Итак, набрав !!
, вводится один !
.
Если вы используете оболочку zsh
, вы можете добавить в свой~/.zshrc
:
zmodload zsh/zselect
bang() {
zle self-insert
if [[ $CONTEXT = start && $LBUFFER =~ '^!+$' ]]; then
local -a old_region_highlight=($region_highlight)
region_highlight+=("0 $CURSOR fg=red,bg=white,bold,standout")
zle -R 'Will you please stop?!'
zselect -t 100 -r 0 < /dev/tty
region_highlight=($old_region_highlight)
LBUFFER=
fi
}
zle -N bang
bindkey '!' bang
Таким образом, когда вы вводите один или несколько !
в начале буфера редактирования, он выделяет их красным, выдает вам сообщение и удаляет их (через одну секунду или раньше, если вы набираете что-либо еще ).