我正在输入这个命令:
sh -c "echo '!a'"
它给出了一个错误
bash !a': event not found
这在某种程度上是因为!是一个特殊字符,但由于我用单引号括起来,所以我不应该得到这个。
答案1
感叹号用于检索你的 bash 历史记录。
在您的情况下,错误消息来自您当前的 shell,而不是您想要启动的 shell(*)。发生的情况是单引号不计算在内,因为对于您当前的 shell,它们位于双引号内,因此失去了其特殊状态并成为纯字符。但在双引号内,历史扩展仍然!
有效...
如果您以其他方式执行此操作:sh -c 'echo "!a"'
那么它就会起作用,因为外部单引号“隐藏”了!
。
sh
(*)如果替换为echo
:,则会遇到同样的错误:echo -c "echo '!a'"
答案2
!
是保留字;这里是 sh 手册的一部分:
保留字
保留字是对于 shell 具有特殊含义的字,它们位于行首和控制运算符之后。以下是保留字:
! elif fi while case else for then { } do done until if esac
如果要将保留关键字打印为字符:
sh -c "echo '"\!"a'"
看一下 sh/bash 手册!