Python调用命令行-/bin/sh: 1: source: not found


python调用命令行

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)

修改系统默认解释器方法

  1. 执行ls -l /bin/sh命令,若得到结果/bin/sh -> dash,则说明Shell的解释器为dash。
  2. 执行dpkg-reconfigure dash命令,然后选择no。 此步骤需要root权限。
  3. 再次执行ls -l /bin/sh命令,若得到结果/bin/sh -> bash,则说明成功更改Shell的解释器为bash。

shell, shell script, sh 与 bash

  • Shell 中文意思贝壳,寓意类似内核的壳。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
  • Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发 shell 自身。
  • sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。在一般的linux系统当中(如redhat,centos),使用sh调用执行脚本相当于打开了bash的POSIX标准模式(等效于bash的 –posix 参数)一般的,sh是bash的“子集”
  • bash(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
    #!是一个特殊标记,说明这是一个可执行的脚本。除了第一行,其他以#开头的都不再生效,为注释。 #!后面是脚本的解释器程序路径。这个程序可以是shell,程序语言或者其他通用程序,常用的是bashsh
  • sh 跟bash的区别,实际上是bash有没开启POSIX模式的区别。sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。

评论: