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

时间:2013-12-16 22:21:08

标签: bash

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

#! /bin/sh
SCRIPT="/tmp/echoscript.sh >> /tmp/log"
/bin/sh ${SCRIPT}

echoscript.sh只是'回声'abc“'

意外的是'abc'进入终端而不进入/ tmp / log文件。那是为什么?

如果我将第三行更改为:

/bin/sh ${SCRIPT} >> /tmp/log

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

4 个答案:

答案 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