我的剧本:
#!/bin/bash
generic()
{
echo $1;
$1 > temp.txt 2>&1
}
generic "echo asd > /dev/null 2>&1; echo temp"
预期结果:
实际结果:
为什么只有第一个echo语句运行,其输出重定向到temp.txt。另外,为什么第二个命令被视为字符串?
答案 0 :(得分:0)
您需要阅读spec
(这是POSIX sh规范,因为bash没有真正的规范.bash尝试与POSIX sh兼容,但增加了不必要的复杂性。你应该使用#!/bin/sh
作为初学者和每当你想写一个理智的脚本)
特别是,您不能在变量中存储除单个命令之外的任何内容。如果你通过说$1
来执行变量,那么这被解释为一个命令:
在空格或IFS
变量内的任何内容上进行拆分。在您的示例中,此结果位于以下标记列表中:
然后将此列表作为一个过程执行,相当于用C execlp("echo", "echo", "asd", ">", "/dev/null", "2>&1;", "echo", "temp", NULL);
编写。
请注意,如果您编写了"$1"
,则会导致shell尝试启动名为echo asd > /dev/null 2>&1; echo temp
的程序而不带参数。
如果您想要将字符串重新评估为shell命令行,则需要使用eval
:eval "$1"
。但要注意安全隐患! Eval被许多人认为是邪恶的。