我正在一起测试我的 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脚本中cat shell脚本的结果?
最佳答案
sh ./env_check
行将替换为脚本 ./env_check
的输出。当前 shell 将尝试将它们作为命令执行。在您的情况下,它失败了,因为幸运的是,bash 无法将它们解释为命令。这可能是一场灾难。例如,如果您的脚本产生类似 rm -rf *
的输出,您可以想象会发生什么。
如果你想显示 ./env_check
的结果,你必须在行前加上 echo
,这样 ./env_check
的输出code> 将被馈送到 echo。
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
...
关于linux - 如何在 shell 脚本中运行 shell/python 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45450774/