Почему делает восклицательный знак в причине двойных кавычек ошибка Bash?

Посмотрите на эти команды:

$ 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 ошибка появляется?

25
задан 6 January 2016 в 12:55

2 ответа

! символ расширения истории по умолчанию в Bash, посмотрите раздел "HISTORY EXPANSION" в странице справочника Bash

  • Расширение истории не происходит если ! включается одинарными кавычками, как в

    notify-send 'SYNC TIME!'
    
  • Расширение истории не происходит если ! сопровождается пространством, вкладкой, новой строкой, возвратом каретки, или =, как в

    notify-send SYNC TIME!
    
  • Расширение истории действительно происходит в

    echo "SYNC TIME!"
    

    Таким образом, Вы получите ошибку, если не будет команды, запускающейся с " в Вашей истории

31
ответ дан 23 November 2019 в 01:12

Поскольку в ударе, ! зарезервированное слово (хорошо, символ), он имеет особое значение в различных контекстах. В данном случае Вы сталкиваетесь с его значением в поиске истории. От 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\!
15
ответ дан 23 November 2019 в 01:12

Другие вопросы по тегам:

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