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

时间:2017-08-02 03:05:33

标签: linux bash shell

我正在测试我的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脚本的结果?

2 个答案:

答案 0 :(得分:2)

sh ./env_check行将替换为脚本./env_check的输出。当前shell将尝试将它们作为命令执行。在你的情况下它失败了,因为,幸运,bash无法将它们解释为命令。这可能是一场灾难。例如,如果您的脚本生成类似rm -rf *的输出,您可以想象会发生什么。

如果您想显示./env_check的结果,则必须在echo之前添加一行,以便将./env_check的输出反馈给回声。

echo `sh ./env_check`

或者,如果您想将输出捕获到变量中,请执行以下操作。

out=`sh ./env_check`

同样适用于cat ...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
...

答案 1 :(得分:0)

出现问题是因为您的shell接受sh ./env_checkpython vm_qga_tool ...的输出作为命令,因此它将尝试运行这些命令。 要修复它,你应该消除" " symbol from sh ./env_check or}} {@ {{{{{{

相关问题