Можно ли сделать так, чтобы в терминале не учитывались начальные восклицательные знаки? (Я набираю их инстинктивно из-за ipython)

У меня была проблема, что я хотел записать текущий historyв файл , но все же хотел, чтобы записи записывались в основной bashhistory

Я решил эту проблему, просто прикрепив файл сcat:

history -a current-history
cat current-history >>.bash_history
23
05.12.2019, 16:19
3 ответа

В интерактивных оболочках по умолчанию!используется для расширения истории :оболочка будет искать команду, соответствующую тексту, следующему за !, и выполнять ее. Как указано в , этот ответ на не может использовать восклицательный знак (! )в Баше? оболочки позволяют отключить расширение истории:

  • Баш:set +H
  • Зш:set -K

Если вы никогда не хотите использовать расширение истории, управляемое восклицательными знаками, вы можете добавить их в сценарии запуска вашей оболочки.

Это не приведет к игнорированию !, но позволит избежать выполнения команд из вашей истории. !commandбудет жаловаться, что !commandне существует.

Эти настройки не влияют на сценарии оболочки, они получают собственные оболочки с не -интерактивной конфигурацией (, которая по умолчанию не включает расширение истории ).

33
27.01.2020, 19:41

Если вы никогда не используете ! с терминала, вы можете назначить его функции, которую вы никогда не используете, например (в моем случае )werase:

stty werase !

Затем всякий раз, когда вы набираете !, предыдущее слово просто стирается. Если вы когда-либо вводите его только в начале команды терминала, это просто не будет иметь никакого эффекта.

Если вам когда-нибудь понадобится настоящий восклицательный знак, вы все равно можете ввести его, поставив перед ним CTRL -V (или любой другой символ lnext), чтобы заключить его в кавычки или экранировать.

Если вы обычно не используете функциональность lnext, вам может оказаться удобнее переопределить lnextна !; это позволит вам ввести восклицательный знак, введя его дважды (, первый из которых цитирует второй ).

stty lnext !

Более подробное объяснение того, как это работает:

Функциональность lnextзаключается в следующем :«не интерпретировать следующий символ как что-то особенное :, просто принять символ в качестве ввода таким, какой он есть». Если это специальный символ stty,тогда не применяйте эту специальную функциональность, а просто используйте персонажа как такового. Сюда входит символ, назначенный функции lnext.

Символом lnextпо умолчанию является CTRL -V (мнемоника :«дословно», как и в :введите следующий символ дословно ). Здесь мы вместо этого переназначаем эту функцию символу !.

lnextвыбран в первую очередь потому, что в большинстве случаев он не действует (, например, когда следующий введенный символ является обычным символом ). Когда вы случайно набираете !в начале строки, следующий символ почти всегда является обычным символом без каких-либо специальных действий, поэтому цитирование/экранирование его (явно рассматривается как обычный символ )не наносит вреда. Когда мы пишем aпосле !, значение меняется с «написать a» на более конкретное значение, которое делает то же самое. :"напишите a, игнорируйте все остальное, просто сделайте это!"

Если мы хотим создать реальный символ !, мы можем использовать эту функцию lnext, чтобы заключить его в кавычки. Итак, набрав !!, вводится один !.

19
27.01.2020, 19:41

Если вы используете оболочку 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

Таким образом, когда вы вводите один или несколько !в начале буфера редактирования, он выделяет их красным, выдает вам сообщение и удаляет их (через одну секунду или раньше, если вы набираете что-либо еще ).

5
27.01.2020, 19:41

Теги

Похожие вопросы