Bash 为什么在命令替换中输入重定向的工作方式不同?
考虑以下情况:Bash 为什么在命令替换中输入重定向的工作方式不同?,bash,shell,file,redirect,command-substitution,Bash,Shell,File,Redirect,Command Substitution,考虑以下情况: $ echo "abc" > file $ var=$(< file) $ echo "$var" abc $echo“abc”>文件 $var=$(
$ echo "abc" > file
$ var=$(< file)
$ echo "$var"
abc
$echo“abc”>文件
$var=$(
在命令替换中,我们使用一个重定向和一个文件,文件的内容被变量正确捕获
但是,以下所有示例均不产生任何输出:
$ < file
$ < file | cat
$ < file > file2
$ cat file2
$<文件
$file2
$cat文件2
在所有这些情况下,命令的内容不会重定向到输出
那么,当重定向放在命令替换中与不放在命令替换中时,为什么会有区别呢?在命令替换块内部与外部时,重定向是否具有不同的功能?$(
不是重定向;这只是命令替换的一个特例,它使用与输入重定向相同的语法
通常,输入重定向必须与命令相关联。有一个案例可以被认为是例外,那就是
$ > file
从技术上讲,它不是重定向,因为没有任何东西被重定向到文件,但是
文件仍然以写入模式打开,这会将其截断为0字节。您应该使用cat@anubhava:这是真的。甚至cat文件
。但我不明白的是不同语法背后的原因。为什么$(在@anubhava中:我明白了,
语法只在命令替换内部有效。我认为内部或外部的命令将遵循相同的规则。从技术上讲,$(
不是重定向;它是命令替换的一种特殊情况,看起来像重定向。