这可能是一个非常虚拟的问题,但我在这里碰到了我的头......
为什么这段代码:
#!/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上遇到过这样的事情:/
我搜索了很多,却找不到令人满意的答案。
非常感谢您的任何提示!
答案 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的双引号,它也不会起作用。
所以唯一的解决办法就是不要逃避命令,对我来说似乎很奇怪,但是它很有用......它有效!