Mac OS Shell exec命令,其中包含管道

时间:2011-03-29 22:04:06

标签: macos bash shell

这可能是一个非常虚拟的问题,但我在这里碰到了我的头......

为什么这段代码:

#!/bin/bash -x    
cmd="launchctl list | grep -i \"twshows\""
echo $($cmd)

产生此输出:

% ./test.sh
+ cmd='launchctl list | grep -i "twshows"'
++ launchctl list '|' grep -i '"twshows"'
usage: launchctl list [-x] [label]
+ echo

而不是简单地执行命令。 这管有什么问题?是不是逃脱了? 我真的很绝望,从来没有在linux上遇到过这样的事情:/

我搜索了很多,却找不到令人满意的答案。

非常感谢您的任何提示!

3 个答案:

答案 0 :(得分:2)

您想要做的是使用eval来评估$cmd变量:

#!/bin/bash -x    
cmd="launchctl list | grep -i \"twshows\""
eval $cmd

大恐怖警告

eval可能非常邪恶,因为它会评估该变量中的任何内容。如果该变量是从用户提供的输入初始化的,比如rm -rf \; echo 'gotcha!',它将使用与您运行它的shell相同的权限执行该变量。

答案 1 :(得分:1)

不要将命令放入变量中!执行吧!出了什么问题:

#!/bin/bash
launchctl list | grep -i \"twshows\"

答案 2 :(得分:0)

好吧,我正在回答自己...我发现这样做的时候:

echo $(launchctl list | grep -i "aqua")

有效。

主要区别在于逃避技术。如果你逃避整个命令,就像这样:

echo $(" launchctl list | grep -i "aqua" ")

找不到该命令。 如果将命令放在变量中,则会发生相同的操作。 最后,如果你逃避grep的双引号,它也不会起作用。

所以唯一的解决办法就是不要逃避命令,对我来说似乎很奇怪,但是它很有用......它有效!