bash脚本中出现意外的输出和错误重定向

时间:2013-09-29 10:51:32

标签: bash output-redirect

我的剧本:

#!/bin/bash

generic()
{

    echo $1;
    $1 > temp.txt 2>&1
}

generic "echo asd > /dev/null 2>&1; echo temp"

预期结果:

  1. “asd”应该转到/ dev / null
  2. “temp”应该进入temp.txt文件。
  3. 实际结果:

    1. “asd> / dev / null 2>& 1; echo temp”进入temp.txt文件。
    2. 为什么只有第一个echo语句运行,其输出重定向到temp.txt。另外,为什么第二个命令被视为字符串?

1 个答案:

答案 0 :(得分:0)

您需要阅读spec

(这是POSIX sh规范,因为bash没有真正的规范.bash尝试与POSIX sh兼容,但增加了不必要的复杂性。你应该使用#!/bin/sh作为初学者和每当你想写一个理智的脚本)

特别是,您不能在变量中存储除单个命令之外的任何内容。如果你通过说$1来执行变量,那么这被解释为一个命令:

在空格或IFS变量内的任何内容上进行拆分。在您的示例中,此结果位于以下标记列表中:

  1. 回波
  2. ASD
  3. >
  4. 的/ dev / null的
  5. 2 - ;&安培; 1;
  6. 回波
  7. 温度
  8. 然后将此列表作为一个过程执行,相当于用C execlp("echo", "echo", "asd", ">", "/dev/null", "2>&1;", "echo", "temp", NULL);编写。

    请注意,如果您编写了"$1",则会导致shell尝试启动名为echo asd > /dev/null 2>&1; echo temp的程序而不带参数。

    如果您想要将字符串重新评估为shell命令行,则需要使用evaleval "$1"。但要注意安全隐患! Eval被许多人认为是邪恶的。