Macos 带有管道的Mac OS Shell exec命令
这可能是一个非常愚蠢的问题,但我在这里把头撞在墙上 为什么该代码:Macos 带有管道的Mac OS Shell exec命令,macos,bash,shell,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] +
#!/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上从来没有遇到过这样的事情:/
我找了很多,但找不到满意的答案
非常感谢您的任何提示 您要做的是使用
eval
计算$cmd
变量:
#!/bin/bash -x
cmd="launchctl list | grep -i \"twshows\""
eval $cmd
可怕的大警告
eval
可能非常邪恶,因为它将计算该变量中的任何内容。如果该变量是从用户提供的输入初始化的,比如说rm-rf\;echo‘抓住你了!’
它将以与运行它的shell相同的权限执行该命令。您要做的是使用eval
计算$cmd
变量:
#!/bin/bash -x
cmd="launchctl list | grep -i \"twshows\""
eval $cmd
可怕的大警告
eval
可能非常邪恶,因为它将计算该变量中的任何内容。如果该变量是从用户提供的输入初始化的,比如说rm-rf\;echo‘抓住你了!’代码>它将以与运行它的shell相同的权限执行该命令。不要将该命令放入变量中!执行它!有什么问题吗
#!/bin/bash
launchctl list | grep -i \"twshows\"
不要将命令放入变量中!执行它!有什么问题吗
#!/bin/bash
launchctl list | grep -i \"twshows\"
好的,所以我回答我自己。。。我发现在做这些事情时:
echo $(launchctl list | grep -i "aqua")
它起作用了
主要区别在于逃逸技术。如果你逃避整个命令,就像这样:
echo $(" launchctl list | grep -i "aqua" ")
将找不到该命令。
如果将命令放入变量中,同样的情况也会发生。
最后,如果您对grep的双引号进行了转义,那么它也不会起作用
所以唯一的解决办法就是不要逃避命令,这对我来说似乎很奇怪,但至少。。它起作用了 好吧,我回答我自己。。。我发现在做这些事情时:
echo $(launchctl list | grep -i "aqua")
它起作用了
主要区别在于逃逸技术。如果你逃避整个命令,就像这样:
echo $(" launchctl list | grep -i "aqua" ")
将找不到该命令。
如果将命令放入变量中,同样的情况也会发生。
最后,如果您对grep的双引号进行了转义,那么它也不会起作用
所以唯一的解决办法就是不要逃避命令,这对我来说似乎很奇怪,但至少。。它起作用了 此命令不起作用,因为命令是单独启动的。因此grep没有输入流。奇怪的是,我也没有看到launchctl列表的输出。。。如果我单独启动这个命令(不使用grepping),它会像一个符咒一样工作。这就是我在执行代码时得到的。如果我单独启动“launchctl list”,效果会非常好。但无论如何,答案是无效的,因为我确实需要能够执行任何命令(这是一个executebash函数)。因此,简单地启动命令是行不通的,这是我的错,我没有在我的问题中明确它。我以前从来没有注意到这一点,我总是在shell中为linux编程,从来没有为mac编程。这一个不工作,因为命令是单独启动的。因此grep没有输入流。奇怪的是,我也没有看到launchctl列表的输出。。。如果我单独启动这个命令(不使用grepping),它会像一个符咒一样工作。这就是我在执行代码时得到的。如果我单独启动“launchctl list”,效果会非常好。但无论如何,答案是无效的,因为我确实需要能够执行任何命令(这是一个executebash函数)。因此,简单地启动命令是行不通的,这是我的错,我没有在我的问题中明确它。我以前从未注意到这一点,我总是在shell中为linux编程,从来没有为mac编程。这是这个脚本的调试:`%./test.sh(03-31 19:43)+cmd='launchctl list | grep-I“twshows”'+eval launchctl list'|'grep-I'“twshows”“++launchctl list++grep-i twshows`对不起,代码全搞乱了。找不到如何正确编辑(预览可能有用:/)。因此,正如您所看到的,它也不起作用……这是这个脚本的调试:`%./test.sh(03-31 19:43)+cmd='launchctl list | grep-i“twshows”'+eval launchctl list'|'grep-i'“twshows”“++launchctl list++grep-i twshows`对不起,代码全搞乱了。找不到如何正确编辑(预览可能有用:/)。所以它也不起作用,正如你所看到的。。。