Назад | Перейти на главную страницу

Что такое «-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»? Я никогда раньше не слышал об этой концепции. Кроме того, как мне вывести "!" в конце предложения?

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

!rm

вызовет и выполнит последнюю команду, которая началась со строки "rm", и

!rm:p

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

Пытаться

echo reboot your instance\!

чтобы защитить (убрать) восклицательный знак от bash.

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

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

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

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

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

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

Ура.

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

Несколько способов справиться с ситуацией

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

echo 'Reboot your instance!'

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

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

В 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!

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

cat <<EOF
Reboot your instance!
EOF

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

Вы также можете добавить

histchars=  

В ./bash_profile (или используйте его как раз в командной строке)

Отключить ! от того, чтобы быть «специальным историческим символом», или установить его на что-то другое.

Предупреждение; некоторые вещи могут сломаться, если вы установите его, например, на ~ и, возможно, другие струны.

Смотреть:

$ echo "!test"
-bash: !test: event not found
$ histchars=
$ echo "!test"
!test
$ histchars=7
$ echo "7test"
-bash: 7test: event not found
$ histchars=
$ histchars=~
$ histchars=
hars=hars=~     # odd output
$ ~/test
-bash: /test: event not found