subprocess执行命令行运行的是系统默认的sh而不是bash, 执行source命令时会报错/bin/sh: 1: source: not found
,原因是Shell的解释器不是bash,需把Shell的解释器更改为bash(方法见后)。
或者采用如下的变通方法。
import subprocess
# 将带有source的命令写入文件,并添加执行权限,然后执行
subprocess.getoutput('echo "source /usr/local/bin/tool.sh && log ipv6 update" > ~/ipv6.sh && chmod +x ~/ipv6.sh && bash ~/ipv6.sh')
# 使用heredoc将命令写为字符形式,\n为换行符
subprocess.getoutput('bash << EOF\n source /usr/local/bin/tool.sh \nlog ipv6 update \nEOF')
# 将字符串放于三引号中,可直接换行
cmd = '''bash <<EOF
source /usr/local/bin/tool.sh
log ipv6 nochange
exit
EOF'''
subprocess.run(cmd,shell=True)
sys.exit(0)
ls -l /bin/sh
命令,若得到结果/bin/sh -> dash
,则说明Shell的解释器为dash。dpkg-reconfigure dash
命令,然后选择no
。
此步骤需要root权限。ls -l /bin/sh
命令,若得到结果/bin/sh -> bash
,则说明成功更改Shell的解释器为bash。#!
是一个特殊标记,说明这是一个可执行的脚本。除了第一行,其他以#开头的都不再生效,为注释。
#!
后面是脚本的解释器程序路径。这个程序可以是shell,程序语言或者其他通用程序,常用的是bash
、sh
。