我最近在 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' 转到日志文件。
您不能将重定向放入这样的变量中。当你这样做时,Bash 会解释/bin/sh ${SCRIPT}为就像你写的:
/bin/sh "/tmp/echoscript.sh" ">>" "/tmp/log"
Run Code Online (Sandbox Code Playgroud)
请注意如何">>"引用,从而终止尝试的重定向。发生这种情况是因为 Bash 分阶段解析命令,并且解析重定向发生在变量扩展之前。不检查变量值的重定向。