Посмотрите на эти команды:
$ 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
ошибка появляется?
!
символ расширения истории по умолчанию в Bash, посмотрите раздел "HISTORY EXPANSION" в странице справочника Bash
Расширение истории не происходит если !
включается одинарными кавычками, как в
notify-send 'SYNC TIME!'
Расширение истории не происходит если !
сопровождается пространством, вкладкой, новой строкой, возвратом каретки, или =
, как в
notify-send SYNC TIME!
Расширение истории действительно происходит в
echo "SYNC TIME!"
Таким образом, Вы получите ошибку, если не будет команды, запускающейся с "
в Вашей истории
Поскольку в ударе, !
зарезервированное слово (хорошо, символ), он имеет особое значение в различных контекстах. В данном случае Вы сталкиваетесь с его значением в поиске истории. От man bash
:
History expansions introduce words from the history list into the input
stream, making it easy to repeat commands, insert the arguments to a
previous command into the current input line, or fix errors in previous
commands quickly.
[...]
History expansions are introduced by
the appearance of the history expansion character, which is ! by
default. Only backslash (\) and single quotes can quote the history
expansion character.
В основном то, что это означает, - то, что удар возьмет символы после !
и ищите свою историю первую команду, она находит, что запускается с тех символов. Легче продемонстрировать, чем объясните:
$ echo foo
foo
$ !e
echo foo
foo
!
активированное расширение истории, которое соответствовало первой команде, запускающейся с e
который был ранее выполнение echo foo
который был затем выполнен снова. Так, когда Вы записали "SYNC TIME!"
, колотите видел !"
, искавшая история для команды, запускающейся с "
, отказавший и жаловался на это. Можно получить ту же ошибку путем выполнения, например !nocommandstartswiththis
.
Для печати восклицательного знака необходимо выйти из него одним из этих двух способов:
echo 'Hello world!'
echo Hello world\!