来自 Bash 手册
3.7.1 简单命令扩展
当执行一个简单的命令时,shell 从左到右执行以下扩展、赋值和重定向。
解析器标记为变量赋值的单词(命令名称前面的单词)和重定向将被保存以供以后处理。
不是变量赋值或重定向的字会被扩展(请参见第 3.5 节 [Shell 扩展],第 21 页)。如果扩展后仍有任何单词,则第一个单词将被视为命令名称,其余单词将被视为参数。
重定向的执行方式如上所述(参见第 31 页第 3.6 节 [重定向])。
每个变量赋值中“=”后面的文本在赋值给变量之前都会经过波形符扩展、参数扩展、命令替换、算术扩展和引号删除。
它提到了简单命令的以下部分发生的扩展:命令名称、命令参数和赋值。
我想知道重定向部分是否也发生扩展?如果是,您能举一些例子吗?谢谢。
答案1
是的,如果您重定向到变量的值或命令替换的结果/从变量的值或命令替换的结果重定向,那么这将在步骤 2 中进行扩展。
示例(创建名为 的文件file
):
outfile='file'
date >"$outfile"
但是,您不能这样做
redir='>'
date $redir file
因为这会date
使用操作数>
和来调用file
。这是因为在步骤 1 中解析命令行时,上面没有“解析器标记为重定向的单词”。