Попробуйте выполнить следующее в оболочке 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