Bash 脚本重定向不起作用,为什么?

Jef*_*eff 6 bash

我最近在 bash 脚本中发现了一个意外行为,我想在解决它之前先了解它。这是一个简化的示例:

#! /bin/sh
SCRIPT="/tmp/echoscript.sh >> /tmp/log"
/bin/sh ${SCRIPT}
Run Code Online (Sandbox Code Playgroud)

echoscript.sh 只是做 'echo "abc"'

出乎意料的是,'abc' 进入终端而不是 /tmp/log 文件。这是为什么?

如果我将第三行更改为:

/bin/sh ${SCRIPT} >> /tmp/log
Run Code Online (Sandbox Code Playgroud)

然后我得到了预期的结果;'abc' 转到日志文件。

Joh*_*ica 5

您不能将重定向放入这样的变量中。当你这样做时,Bash 会解释/bin/sh ${SCRIPT}为就像你写的:

/bin/sh "/tmp/echoscript.sh" ">>" "/tmp/log"
Run Code Online (Sandbox Code Playgroud)

请注意如何">>"引用,从而终止尝试的重定向。发生这种情况是因为 Bash 分阶段解析命令,并且解析重定向发生在变量扩展之前。不检查变量值的重定向。