这可能是许多常见问题解答 - 而不是使用:
cat file | command
Run Code Online (Sandbox Code Playgroud)
(这被称为无用的猫),正确的方式应该是:
command < file
Run Code Online (Sandbox Code Playgroud)
在第二,"正确"的方式 - 操作系统不必产生额外的过程.
尽管知道这一点,我继续使用无用的猫有两个原因.
更美观 - 我喜欢数据仅从左到右均匀移动.而且它更容易更换cat别的东西(gzcat,echo,...),添加第二个文件或插入新的过滤器(pv,mbuffer,grep...).
我"觉得"在某些情况下可能会更快.更快,因为有2个进程,1st(cat)执行读取而第二个执行任何操作.它们可以并行运行,这意味着有时可以更快地执行.
我的逻辑是否正确(第二个原因)?
我有一个只包含一行的输入文件:
$ cat input
foo bar
Run Code Online (Sandbox Code Playgroud)
我想在我的脚本中使用这一行,有三种方法可以让我知道:
line=$(cat input)
Run Code Online (Sandbox Code Playgroud)
line=$(<input)
Run Code Online (Sandbox Code Playgroud)
IFS= read -r line < input
Run Code Online (Sandbox Code Playgroud)
例如,使用命令替换意味着我会生成一个子shell,而read我不这样做,对吗?还有什么其他的差异,并且有一种方式优于其他方式?我也注意到(有strace)只是因为某种原因read触发了系统调用openat.其他人怎么可能不这样做?
$ strace ./script |& grep input
read(3, "#!/usr/bin/env bash\n\ncat > input"..., 80) = 80
read(255, "#!/usr/bin/env bash\n\ncat > input"..., 167) = 167
read(255, "\nline=$(cat input)\nline=$(<input"..., 167) = 60
read(255, "line=$(<input)\nIFS= read -r line"..., 167) = 41
read(255, "IFS= read -r line < input\n", 167) = 26
openat(AT_FDCWD, "input", O_RDONLY) = 3
Run Code Online (Sandbox Code Playgroud)