Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 带有管道的Mac OS Shell exec命令_Macos_Bash_Shell - Fatal编程技术网

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`对不起,代码全搞乱了。找不到如何正确编辑(预览可能有用:/)。所以它也不起作用,正如你所看到的。。。