В bash, как мне избежать восклицательного знака?
Я хочу сделать что-то вроде bzr commit -m "It works!"
, Я могу избежать восклицательного знака, выполнив bzr commit -m "It works\!"
, Тем не менее, мое сообщение о фиксации содержит обратную косую черту. Как мне избежать восклицательного знака, игнорируя при этом обратную косую черту?
6 ответов
Поскольку вы не зависите от bash для расширения переменных в сообщении фиксации, вы можете вместо этого использовать одинарные кавычки. Строки в одинарных кавычках не раскрываются с помощью bash.
bzr commit -m 'This does work!'
Вот другой метод, если вы хотите двойные кавычки, а также восклицательный знак:
echo "It's broken"'!'
Это работает, даже если !
не в конце строки.
Например:
echo "hello there"'!'" and goodbye"
Бонус: аналогичная техника может быть использована для экранирования любого текста в Sh или Bash (с помощью sed): см. Первый вариант в этом ответе. Далее, если у вас есть bash-completion
установлено, у вас, вероятно, есть quote()
функция уже доступна.
Отключить расширение истории:
set +H
или же
set +o histexpand
Вы можете добавить одну из этих команд в свой ~/.bashrc
если вы обычно не используете расширение истории.
В Bash 4.3 добавлен особый случай:
символ раскрытия истории также рассматривается как заключенный в кавычки, если он непосредственно предшествует закрывающей двойной кавычке в строке в двойных кавычках
Используйте одинарные кавычки (') вместо двойных кавычек ("). Одинарные кавычки отключают всю интерпретацию содержимого в них, в то время как двойные кавычки отключают только некоторые.
bzr commit -m 'It works!'
Я только сейчас нашел другой способ, который будет по крайней мере работать с echo
Строки (предложения), которые вы хотите акцентировать с восклицательным знаком. Он выполняет более или менее конечный прогон вокруг своей вершины Bash и занимает чуть больше времени для кодирования.
Гекс для восклицательного знака, как указано на http://www.ascii-code.com/, равен 21, так что если вы поставите \x21
в конце вашей строки, echo -e $foo
, делать $foo
его собственное расширенное эхо [т.е. foo=$(echo -e "$foo")
], что вы получаете, когда вы echo $foo
снова строка с !
в конце. И никакого переключения его оси тоже нет.
Работает наверняка в Bash 4+. Более ранние версии, ymmv.
Недавно я нашел другой способ сделать это.
Это общий способ заставить Bash выполнить экранирование за вас, поэтому он удобен в произвольных случаях.
Из этой статьи :
Введите строку Bash, начинающуюся с комментария #, затем запустите !:q на следующей строке, чтобы увидеть, что будет с правильным экранированием Bash.
bash-3.2$ # This string 'has single' "and double" quotes and a $
bash-3.2$ !:q
'# This string '\''has single'\'' "and double" quotes and a $'
bash: # This string 'has single' "and double" quotes and a $: command not found
Вы также можете добавитьp
модификатор (так:!:q:p
чтобы избежать ошибки «команда не найдена»)