以下是我在 bash 中输入的内容以及我得到的关于“echo”的结果:
$ echo '!$'
!$
$ echo "!$"
echo "'!$'"
'!$'
我想知道“echo”如何处理第二个输入。在我看来,“echo”会首先打印您输入的字符串(如果需要,则扩展一些字符串),然后执行某些字符串(如果它们是可执行的)。
我可以构造但无法理解的一个更令人兴奋的例子是:
$ echo '!$'
!$
$ echo "!echo "!$""
echo "echo '!$' "'!$'""
echo '!$' !$
答案1
在命令中:
echo "!$"
!$
bash
由before扩展至echo
。双引号内,如果启用,将执行历史扩展,除非您!
使用反斜杠转义\
。bash
已经完成了扩展,echo
这里什么也不做,它只是打印得到的内容。
!$引用前面命令的最后一个参数,即 string '!$'
。
在你的第二个例子中:
$ echo '!$'
!$
$ echo "!echo "!$""
echo "echo '!$' "'!$'""
echo '!$' !$
Command echo "echo '!$' "'!$'""
,传递给的参数echo
分为三个部分:
- 首先:
"echo '!$' "
,扩展为 stringecho '!$'
。 - 第二:
'!$'
,扩展为 string!$
。 - 第三:
""
,扩展为空字符串。
答案2
echo
只是迭代其参数并将它们发送到标准输出。
所有的魔法都是由 shell 完成的:shell 用一些模式替换其他模式。例如变量(以 开头$
)、历史记录(以 开头!
)等。
请参阅bash
手册了解更多详细信息。