Пожалуйста, посмотрите на эти команды:
$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found
$
Первые две команды выдают сообщение, как и ожидалось. Третий дает показанную ошибку.
а также
$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
SYNC TIME!
$ echo "SYNC TIME!"
bash: !": event not found
$
Здесь также echo
работает для первых двух команд, но не для третьей.
Больше проблем здесь (хотя я не планировал использовать это): как notify-send "SYNC!TIME"
и echo "SYNC!TIME"
отдавание bash: !TIME": event not found
.
Но оба notify-send
и echo
работают с"SYNC! TIME"
Может кто-нибудь объяснить, почему bash: !": event not found
появляется ошибка?
.bashrc
строкуset +H
. Обратите внимание, что!
это уже не является особенным в сценариях; обращение с ним как с особым нарушило бы многие сценарии, соответствующие стандартам. В интерактивных оболочках он рассматривается только как «особый» и только по умолчанию, пока вы его не исправите. :-)Поскольку в bash
!
это зарезервированное слово (ОК, символ), оно имеет особое значение в разных контекстах. В этом конкретном случае вы попадаете в тупик его значения в поиске истории. Отman bash
:По сути, это означает, что bash будет принимать символы после
!
и искать в вашей истории первую найденную команду, которая начинается с этих символов. Это проще продемонстрировать, чем объяснить:!
Активируется расширение истории, которая соответствует первой команде , начиная сe
которого было ранее запуститьecho foo
который затем запустить снова. Итак, когда вы написали"SYNC TIME!"
, bash увидел!"
, просмотрел историю для команды, начинающейся с"
, потерпел неудачу и пожаловался на это. Вы можете получить ту же ошибку, запустив, например!nocommandstartswiththis
.Чтобы напечатать восклицательный знак, вам нужно убрать его одним из следующих двух способов:
источник
echo Hello world!
работает --- расширение истории не запускается пробелами ;-) (ах, хорошие угловые случаи ...)!
это зарезервированное слово вbash
, так как POSIX также заявляет . Но я уверен, что его статус как такового совершенно не связан с его ролью в расширении истории и не имеет отношения к его обращению в двойных кавычках.!
является зарезервированным словом, потому что оно отрицает статус завершения команды / конвейера, поэтому его нельзя использовать в качестве команды. Ни одно другое зарезервированное слово не является особенным в"
-quoted контексте, в то время как$
это не является зарезервированным словом , но это лечение специально.