Answers:
感叹号是bash历史扩展中的一部分。要使用它,您需要将其用单引号引起来(例如:),'http://example.org/!132'
或直接\
在字符前面(例如:)加上反斜杠()将其转义"http://example.org/\!132"
。
请注意,在双引号中,感叹号之前的反斜杠会阻止历史扩展,但在这种情况下,不会删除反斜杠。因此,最好使用单引号,这样就不会curl
在URL中传递文字反斜杠。
"http://example.org/\!132"
实际上扩展时没有解释反斜杠(我相信是POSIX合规性的原因)。
\!
和双引号。
|
用于创建管道。如果您要向客户发送脚本,但不确定他们将在哪个shell中运行脚本,则必须对它们全部进行测试!
除了Daniel给出的答案外,如果您不使用,也可以完全关闭历史记录扩展set +H
。
fc -14
代替。 但是,确实可以在不启用历史记录扩展的情况下执行此操作。就个人而言,我用!$
和!vi
和sudo !!
,甚至git add !vi:$
往往不足以保证能留下历史扩展。
这也可以
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
要么
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
之所以有效,是因为bash连接了相邻的字符串。当您还有其他需要外壳扩展的内容时,此方法特别有用,因此您不能对整个字符串使用单引号:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
字符用于命令行提示符中的历史记录扩展。
因此,这可能在提示符下出现问题,但在shell脚本文件中却没有。
如您所见,历史记录扩展即使在双引号中也有效。
从Bash 4.3开始,您现在可以使用双引号来引用历史记录扩展字符:
$ bash --version
GNU bash, version 4.3...
[...]
$ echo "Hello World!"
Hello World!
echo
,echo似乎独自处理了这一问题
bash
版本与爆炸没有得到扩展没有关系,这是由于在您的示例中!
,“”后面紧跟着“行尾”,并且阻止了shell尝试扩展它。试试看 echo "!Hello World"
,您会看到bash
会回复bash: !Hello: event not found
。有关更多详细信息,请参见手册
对于在Windows中使用git bash的用户,@ DanielPittman可接受的答案有效。但是,应将反斜杠(\)替换为正斜杠(/)。
例如,在Unix中,它看起来像这样:
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
对于Windows,可能是这样的(关注授权标头部分中的正斜杠)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'