root@raspberrypi:~# cat >test
echo succeed
root@raspberrypi:~# <test
root@raspberrypi:~# `<test`
succeed
我猜原因是信号丢失。但是enter
如何发送enter
答案1
在 Bash 和其他一些 shell 中,`<test`
是相当于以下内容的简写`cat test`
:
命令替换
$(cat file)
可以替换为等效但更快的命令$(< file
)。
(-style 命令替换也是如此`...`
)。
这意味着你的命令
$ `<test`
是相同的
$ `cat test`
- 也就是说,将test
文件的内容插入到命令行中代替命令替换表达式,然后,因为它位于命令的开头,以第一个单词作为命令名执行结果。
另一方面,
$ <test
只是一个空命令,其标准输入从test
文件重定向,在任何类似 POSIX 的 shell 中。它本质上与: <test
:什么都不做并成功。这不是很有用,但它将要test
如果不存在或不可读,则引发错误。
相反的方向 ,>test
将创建或截断test
, 有时很有用。
`<test`
Bash、zsh、ksh 等中和的特殊行为$(<test)
与命令替换通常复制同一命令的普通行为的方式不一致。对于像这样的命令来说,这是一个便利和性能特征
printf '%s@%s\n' $(<username.txt) $(<host.txt)
想要将文件内容读入命令行,并保存额外的进程(通过不生成cat
并让 shell 本身读取文件)。
区别与此无关Enter或类似 - 这只是一个特殊情况。我不建议使用$(<file)
来执行文件:使用.
或source
或一些类似的方法来代替说明您正在做什么(即使eval
确实如此)。我什至不建议使用$(<file)
根本不除非你真的确定你处于一个紧密的循环中,产生一个额外的cat
进程很重要,因为人们会像你在这里一样感到困惑,这种情况并不常见。