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事件”吗?我以前从未听过这个概念。另外,我应该如何输出“!”在句子的末尾?
#1 楼
您可以使用set +H
关闭历史记录替换。#2 楼
!
是bash的特殊字符,用于引用以前的命令;例如,!rm
将调用并执行以字符串“ rm”开头的最后一条命令,并
!rm:p
将调用但不执行以字符串“ rm”开头的最后一条命令。 bash将
echo "reboot your instance!"
中的感叹号解释为“在此处替换以感叹号紧随其后的字符开头的最后一个命令”,并对您抱怨道,它找不到您的历史记录中以a开头的事件(命令)单引号。尝试
echo reboot your instance\!
保护(避免)bash的感叹号。
评论
编写两个echo语句;您可以免费获得换行符。
– MadHatter
2010-12-02 14:22
一种简单的解决方案是一次使用单引号和双引号:echo -e“ Text \ nReeboot”'!'
–mmey
2014年10月2日,下午4:51
糟透了如果我不逃避感叹号,bash会合身。如果我确实将其转义,则最后一个字符串中将包含反斜杠。你为什么要这样做,巴什! (pastebin.com/g4PYv56A)
–Hubro
2015年1月23日在7:46
公平地说,@ Hubro,我不确定这都是bash的错。通过使用红宝石将东西喂入bash中,您遇到了一些复杂的事情,我不清楚红宝石在脱逃或增强转义符中起什么作用。
– MadHatter
15年1月23日在8:25
回声“重新启动您的实例!”效果也很好,因为'之间的字符使外壳按字面意义解释它们。
–leetbacoon
20-8-29在23:27
#3 楼
若要解决您的原始问题,请尝试使用单引号而不是双引号。对于后者,bash将尝试扩展某些字符,然后再将结果传递给命令(在本例中为echo)。 bash使用单引号引起来的整个字符串不变,保持不变。!
在命令中用于引用命令行历史记录。请参阅:http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS以获取全套。在上面的示例中,bash尝试将!"
扩展为对事件的引用,然后再回显,从而导致错误。 请注意,在脚本中,所有历史记录命令均被禁用,因为它们仅在交互式shell中才有意义。
我唯一定期使用的是
!$
。它扩展到上一个命令的最后一个参数。在某些地方这是一个有用的速记。 评论
!!填写最后输入的完整命令非常有用;特别是须藤!或pfexec !!
– jgoldschrafe
2010-12-02 11:20
我还发现sudo和pfexec是很好的实用程序,但不必那么热心。
–LeartS
14年4月17日在0:08
$ _在比bash更多的shell中工作,并且它是一个适当的变量,与!$不同。 (和@LeartS:我喜欢你的笑话缺少表情符号。;))
–́ΤZΩΤZnΙΟΥ
16年7月23日在0:28
#4 楼
只需在!
和"
之间放置一个空格即可。评论
您能否添加一个关于您的解决方案为何有效的解释?
– 200_success
2014-09-26 8:20
这是有效的,因为Bash只对待!如果它后面紧跟非空格字符,则将其作为特殊字符。但是,它也会在输出中添加额外的空白,因此可能并不总是需要...
–mmey
2014年10月2日,下午4:50
#5 楼
是的! bash是bash的特殊字符,用于引用以前的命令。几种处理这种情况的方法
以下将按原样输出字符串
echo 'Reboot your instance!'
以下将执行命令并连接字符串
echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`
#6 楼
您还可以使用heredoc:cat <<EOF
Reboot your instance!
EOF
在这种情况下很烦人,因为它不是单线的,但是对于更长的命令(例如编写bash脚本),它是可行的很好。
#7 楼
您还可以在./bash_profile
中添加histchars=
(或在命令行中一次性使用)
禁用
!
一个“特殊历史字符”,或将其设置为其他内容。 警告;当您将其设置为
~
以及其他字符串时,某些事情可能会中断。查找:
$ 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
#8 楼
在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!
评论
可能是一个错误,因为在这里,我有4.4.12,再次需要设置+ H或引号。或者您在某处设置了+ H(例如在/ etc / profile中)。
–波多·蒂森(Bodo Thiesen)
18年4月2日在11:20
在句子的末尾使用!-char可以验证bash的事件检测仍然可以正常工作。版本是4.3.30 ........ $ echo“重新检查句子!foo” bash:!foo:找不到事件
–JohnnyD92
18年8月4日在14:49
#9 楼
!
是zsh的特殊字符。它指向上一个命令。如果需要将其用作字符串字符,请尝试
\!
评论
问题是关于bash。
–安德鲁·舒尔曼(Andrew Schulman)
20年11月9日15:23
评论
您知道语法背后的原因吗?似乎真的很直觉。您可能会想输入+ H启用某些内容,而-H禁用某些内容。
–加文·沃德(Gavin Ward)
16年5月16日在9:19
@PunkyGuy:我不知道其背后的历史(双关语意味深长),但Unix选项通常以连字符(或减号)开头,而+恰恰相反。
–丹尼斯·威廉姆森
16年5月16日在13:19
来自帮助集(以bash表示):“使用+而不是-导致这些标志被关闭。”
–达里奥·塞德尔(Dario Seidl)
20-10-5在8:41