Вопрос: Что такое "-bash:!": Событие не найдено "


Попробуйте выполнить следующее в оболочке bash echo "Reboot your instance!"

При установке:

root@domU-12-31-39-04-11-83:/usr/local/bin# bash --version
GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@domU-12-31-39-04-11-83:/usr/local/bin# uname -a
Linux domU-12-31-39-04-11-83 2.6.35-22-virtual #35-Ubuntu SMP Sat Oct 16 23:57:40 UTC 2010 i686 GNU/Linux
root@domU-12-31-39-04-11-83:/usr/local/bin# echo "Reboot your instance!"
-bash: !": event not found

Может кто-нибудь объяснить, что такое «события bash»? Я никогда не слышал этого понятия раньше. Кроме того, как я должен выводить «!» в конце предложения?


86
2017-12-02 10:45


Источник




Ответы:


Вы можете отключить замещение истории, используя set +H,


37
2017-12-02 16:31



Вы знаете причины синтаксиса? Кажется, это действительно интуитивно. Вы думаете, что вы наберете +H чтобы что-то и -H чтобы отключить что-то. - PunkyGuy
@PunkyGuy: я не знаю историю (каламбур) за ней, но опции Unix обычно начинаются с дефиса (или минуса) и + просто противоположно этому. - Dennis Williamson


! это специальный символ для bash, он используется для обозначения предыдущих команд; например,

!rm

вспомнит и выполнит последнюю команду, начинающуюся со строки «rm», и

!rm:p

вспомнит, но не выполнит последнюю команду, начинающуюся со строки «rm». bash интерпретирует восклицательный знак в echo "reboot your instance!" в виде "замените здесь последнюю команду, которая начиналась с символа (ов) сразу после восклицательного знака», и ворчит на вас, что он не может найти событие (команду) в вашей истории, которое началось с одной двойной кавычки.

Пытаться

echo reboot your instance\!

защищать восклицательный знак от bash.


85
2017-12-02 10:49



Да, но должно произойти, если я хочу использовать echo -e "некоторый текст $ ENV_VAL еще немного текста \ nReboot сейчас!" ? - Maxim Veksler
Напишите два выражения эха; вы получаете бесплатный перевод. - MadHatter
Простое решение - использовать одинарные кавычки и двойные кавычки одновременно: echo -e "Text \ nReeboot" '!' - mmey
Я не уверен, что это проще, но это сработает, да. - MadHatter
Это отстой. Если я не убегу от восклицательного знака, Баш бросает посадку. Если я делать escape, обратная косая черта включена в финальную строку. Почему ты это делаешь, Бэш! (pastebin.com/g4PYv56A) - Hubro


Чтобы решить вашу оригинальную проблему, попробуйте использовать одинарные кавычки, а не двойные кавычки. В последнем случае bash попытается развернуть определенные символы, прежде чем передать результат команде (эхо в этом случае). С одинарными кавычками bash передает всю строку без изменений.

! используется в командах для обращения к истории командной строки. Видеть: http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS для полного набора. В приведенном выше примере bash пытается расширить !" как ссылка на событие до того, как эхо получает вид, следовательно, ошибка.

Обратите внимание, что в скриптах, все команд истории отключены, поскольку они имеют смысл только в интерактивной оболочке.

Единственный, который я использую на регулярной основе, - это !$, Он расширяется до последнего аргумента предыдущей команды. Это полезное сокращение в местах.


20
2017-12-02 11:02



!! для заполнения последней последней введенной команды чрезвычайно полезно; в частности, sudo !! или pfexec !! - jgoldschrafe
Я также считаю, что sudo и pfexec являются хорошими утилитами, но не нужно быть настолько восторженными. - LeartS
$_ работает в более оболочках, чем bash, и это правильная переменная, в отличие от !$, (и @LeartS: мне понравилось отсутствие вашей шутки смайликов.;)) - ΤΖΩΤΖΙΟΥ


Просто поставьте промежуток между ними! и "чем это сработает.

Приветствия.


4
2017-09-25 07:06



Не могли бы вы объяснить, почему ваше решение работает? - 200_success
Это работает, потому что Баш лечит! как специальный символ, если за ним сразу следует символ без пробелов. Тем не менее, он также добавит лишний пробел в ваш вывод, так что это может не всегда быть желательным ... - mmey


Да, ! является специальным символом для bash, он используется для обозначения предыдущих команд.

Мало того, что вы можете справиться с ситуацией

Следующее выведет строку, поскольку она

echo 'Reboot your instance!'

Следующее выполнит команду и объединит строку

echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`

2
2018-04-25 13:57





В bash 4.3 вам больше не нужно использовать одинарные кавычки или set +H:

$ bash --version
GNU bash, version 4.3.46(1)-release (x86_64-unknown-linux-gnu)
[...]
$ echo "Reboot your instance!"
Reboot your instance!

1
2017-07-12 14:43



Вероятно, ошибка, потому что здесь у меня есть 4.4.12, и еще раз, мне нужно set +H или цитирование. Или у вас есть set +H где-то (например, в /etc/profile). - Bodo Thiesen
Использование! -Char не в конце предложения проверяет, что обнаружение события bash все еще работает нормально. Версия 4.3.30 ........ $ echo «Повторно проверьте ваше предложение! Foo» bash:! Foo: событие не найдено - JohnnyD92


Вы также можете использовать Heredoc:

cat <<EOF
Reboot your instance!
EOF

Это раздражает в этом случае, потому что это не однострочный, а для более длинных команд (например, написания сценария bash), он отлично работает.


0
2017-07-07 11:41