linux - 如何在shell脚本中运行shell/python脚本?

我正在一起测试我的shell脚本和python脚本,所以我编写了一个shell脚本来循环调用这两个脚本,如下所示:

while ((1)) ; do
    /usr/local/bin/ovs-appctl dpdk/vhost-list
    sleep 10
    /usr/local/bin/ovs-appctl dpdk/virtio-net-show n-f879ac2f
    sleep 10
    /usr/local/bin/ovs-appctl dpdk/virtio-net-show n-434ab558
    sleep 10
    /usr/local/bin/ovs-appctl dpdk/virtio-net-show i-brpri-p
    sleep 10
    `sh ./env_check`
    `cat output.txt`
    sleep 10
    `python vm_qga_tool /opt/cloud/workspace/servers/6608da87-e374-4796-adb1-8faa29f49e9a/qga.sock connect:172.16.0.1`
    sleep 10
done

但结果报告错误:
test-dpdk-virtio-net-show.sh: line 13: Checking: command not found
test-dpdk-virtio-net-show.sh: line 15: {"session":: command not found

13号线 cat output.txt,15号线 python vm_qga_tool ...
output.txt是第12行 sh ./env_check的结果, vm_qga_tool的输出如下:
{"session"...

那么如何解决这个问题呢?如何在shell脚本中对shell脚本的结果进行cat?

最佳答案

sh ./env_check行将被脚本的输出替换。当前shell将尝试将它们作为命令执行。在您的情况下,它失败了,幸运的是,bash不能将它们解释为命令。这可能是场灾难。例如,如果您的脚本生成了类似于./env_check的输出,您可以想象会发生什么。
如果要显示rm -rf *的结果,则必须在该行前面加上./env_check,以便将echo的输出输入echo。

echo `sh ./env_check`

或者,如果要将输出捕获到变量中,请执行以下操作。
out=`sh ./env_check`

对于 ./env_checkcat ...
但是,不鼓励使用回拨。而是使用 python ...。( Read more here.
...
sleep 10
echo $(sh ./env_check)
echo $(cat output.txt)
sleep 10
echo $(python vm_qga_tool /opt/cloud/workspace/servers/6608da87-e374-4796-adb1-8faa29f49e9a/qga.sock connect:172.16.0.1)
sleep 10
...

不过,反正你也不需要这么做。如果不需要捕获命令输出,可以直接调用脚本,而不是通过子shell调用。
...
sleep 10
sh ./env_check
cat output.txt
sleep 10
python vm_qga_tool /opt/cloud/workspace/servers/6608da87-e374-4796-adb1-8faa29f49e9a/qga.sock connect:172.16.0.1
sleep 10
...