代码之家  ›  专栏  ›  技术社区  ›  mickp

对于只有一行的文件,“$(cat file)”、“$(<file)”和“read…<file”之间有什么区别?

  •  7
  • mickp  · 技术社区  · 6 年前

    我有一个只包含一行的输入文件:

    $ cat input
    foo bar
    

    line=$(cat input)
    
    line=$(<input)
    
    IFS= read -r line < input
    

    例如,使用命令替换意味着生成一个子shell,而使用 read 我没有,对吧?还有什么其他的区别,而且有一种方式比其他方式更受欢迎?我也注意到 strace )仅此而已 阅读 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
    
    1 回复  |  直到 6 年前
        1
  •  11
  •   that other guy    6 年前
    • line=$(cat input) 是读取整个文件的POSIX方法。它需要叉子。

    • line=$(< input) 对于读取整个文件来说,是一种稍微高效的Bashism。它也分叉,但不必执行。

    • 未提及,但 mapfile readarray 是更有效的bashims,用于逐行将整个文件读入数组。没有叉子。

    • IFS= read -r line < input 是POSIX读取没有子shell的单行的方式。没有叉子。

    -f 跟踪子进程。