我最近在bash脚本中发现了一个意外的行为,在我解决它之前我想先了解它。这是一个简化的例子:
#! /bin/sh
SCRIPT="/tmp/echoscript.sh >> /tmp/log"
/bin/sh ${SCRIPT}
echoscript.sh只是'回声'abc“'
意外的是'abc'进入终端而不进入/ tmp / log文件。那是为什么?
如果我将第三行更改为:
/bin/sh ${SCRIPT} >> /tmp/log
然后我得到预期的结果; 'abc'转到日志文件。
答案 0 :(得分:4)
当扩展变量时,对结果的唯一进一步处理是单词拆分和通配符扩展(也称为通配)。结果不会扫描其他特殊操作符,例如重定向。
如果要完全重新处理命令行,则必须使用eval
:
eval "/bin/sh ${SCRIPT}"
答案 1 :(得分:3)
你不能将重定向放在这样的变量中。当你执行Bash解释/bin/sh ${SCRIPT}
时就好像你写了:
/bin/sh "/tmp/echoscript.sh" ">>" "/tmp/log"
注意如何引用">>"
,杀死尝试的重定向。发生这种情况是因为Bash分阶段解析命令,并且在变量扩展之前解析重定向。不检查变量值的变量值。
答案 2 :(得分:1)
由于$ {SCRIPT}中没有处理重定向,因此无法达到预期效果。你会得到/bin/sh: /tmp/echoscript.sh >> /tmp/log: No such file or directory
。
在运行它之前,你需要告诉shell评估$ {SCRIPT},如下所示:
eval /bin/sh ${SCRIPT}
$ cat /tmp/log
abc
答案 3 :(得分:1)
另一种方式:
alias SCRIPT="/bin/sh /tmp/echoscript.sh >> /tmp/log"
SCRIPT