为什么在命令替换时输入重定向的工作方式不同?

Why does input redirection work differently when in command substitution?

考虑以下情况:

$ echo "abc" > file
$ var=$(< file)
$ echo "$var"
abc

在命令替换中,我们使用了重定向和文件,文件的内容被变量正确捕获。

但是,以下所有示例都没有输出:

$ < file
$ < file | cat
$ < file > file2
$ cat file2

在所有这些情况下,命令的内容都不会重定向到输出。

那么为什么将重定向放在命令替换内或不放在命令替换内会有所不同?在命令替换块内部和外部重定向是否有不同的功能?

$(< file) 不是重定向;它只是命令替换的一个特例,它使用与输入重定向相同的语法。

一般而言,输入重定向必须与命令相关联。有一种情况可以说是例外,那就是

$ > file

从技术上讲,这不是重定向,因为没有任何内容被重定向到 文件,但是 file 仍然 opened in write模式,将其截断为 0 个字节。