如何从变量运行脚本命令?

时间:2010-08-12 16:11:07

标签: linux bash shell command-line

我尝试使用管道运行命令。

基本

single="ls -l"
$single

按预期工作

管道

multi="ls -l | grep e"
$multi
ls: |: No such file or directory
ls: grep: No such file or directory
ls: e: No such file or directory

......毫不奇怪

bash < $multi

$multi: ambiguous redirect

接下来尝试

bash $multi
/bin/ls: /bin/ls: cannot execute binary file

echo $multi > tmp.sh
bash tmp.sh

的工作。

有没有办法在不创建执行脚本的情况下执行更复杂的命令?

3 个答案:

答案 0 :(得分:12)

您正在展示shell和内核之间的区别。

“ls -l”可由系统execve()调用执行。您可以man execve了解详情,但这可能对您来说太详细了。

“ls -l | grep e”需要shell解释来设置管道。不使用shell,'|'字符只是作为ls的参数传递给execve()。这就是您看到“没有此类文件或目录”错误的原因。

解决方案:

cmd="ls -l | grep e"
bash -c "$cmd"

答案 1 :(得分:0)

您需要heredoc才能正确执行此操作。在回答POSIX compliant way to see if a function is defined in an sh script时,我详细介绍了如何将脚本读入变量,以编程方式解析它以获取信息和/或根据需要对其进行修改,然后从另一个脚本或shell函数执行它。这基本上就是你要做的事情,heredoc使它成为可能,因为它提供了一个文件描述符:

% multi='ls -l | grep e'
% sh <<_EOF_
> ${multi}
> _EOF_
< desired output >

这将解决您的简单示例案例。请参阅我的其他答案。

-Mike

答案 2 :(得分:-3)

当你想用管道运行命令时,只需运行它。不要将命令放入变量并尝试运行它。只需执行它

ls -l |grep

如果要捕获输出,请使用$()

var=$(ls -l |grep .. )