Что такое «бас:!»: Событие не найдено »

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

В моей установке:

[email protected]:/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.
[email protected]:/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
[email protected]:/usr/local/bin# echo "Reboot your instance!"
-bash: !": event not found

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

86 голосов | спросил Maxim Veksler 2 ThuEurope/Moscow2010-12-02T13:45:21+03:00Europe/Moscow12bEurope/MoscowThu, 02 Dec 2010 13:45:21 +0300 2010, 13:45:21

7 ответов


37

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

ответил Dennis Williamson 2 ThuEurope/Moscow2010-12-02T19:31:13+03:00Europe/Moscow12bEurope/MoscowThu, 02 Dec 2010 19:31:13 +0300 2010, 19:31:13
85

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

!rm

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

!rm:p

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

Try

echo reboot your instance\!

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

ответил MadHatter 2 ThuEurope/Moscow2010-12-02T13:49:25+03:00Europe/Moscow12bEurope/MoscowThu, 02 Dec 2010 13:49:25 +0300 2010, 13:49:25
20

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

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

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

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

ответил SmallClanger 2 ThuEurope/Moscow2010-12-02T14:02:16+03:00Europe/Moscow12bEurope/MoscowThu, 02 Dec 2010 14:02:16 +0300 2010, 14:02:16
4

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

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

ответил Isik Mater 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 25 Sep 2014 11:06:42 +0400 2014, 11:06:42
2

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

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

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

echo 'Reboot your instance!'

Далее будет выполнена команда и конкатенация строки

echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`
ответил Syed Qaiser 25 PMpThu, 25 Apr 2013 17:57:13 +040057Thursday 2013, 17:57:13
1

В 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!
ответил Eugene Yarmash 12 J000000Tuesday16 2016, 17:43:20
0

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

cat <<EOF
Reboot your instance!
EOF

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

ответил Tom Saleeba 7 J000000Saturday18 2018, 14:41:15

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132