我有一个包含一行文本的输入文件:
$ cat input
foo bar
我想在我的脚本中使用这行代码,目前我知道有三种获取它的方法:
line=$(cat input)
line=$(<input)
IFS= read -r line < input
例如,使用命令替换意味着我会生成一个子shell,而使用read
则不会,是这样吗?还有哪些区别,哪种方式更受欢迎?我还注意到(使用strace
),由于某种原因只有read
触发系统调用openat
。其他方法为什么不会触发?例如,使用命令替换意味着我会生成一个子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
read
会触发系统调用openat
。其他命令为何不会呢?正如您所知,前两个命令在子shell中读取文件。请确保要求strace
跟踪由您跟踪的初始进程生成的子进程。 - axiac