使用子进程查询 Git 状态会在 Linux 下抛出错误

Querying Git status with Subprocess throws Error under Linux

我想使用 python 查询 git 存储库的状态。我正在使用:

subprocess.check_output("[[ -z $(git status -s) ]] && echo 'clean'", shell=True).strip()

这在 MacOS 上运行良好。但是,在 Ubuntu Linux 我收到一条错误消息:

{CalledProcessError}Command '[[ -z $(git status -s) ]] && echo 'clean'' returned non-zero exit status 127.

我进入同一个文件夹并手动 运行

[[ -z $(git status -s) ]] && echo 'clean'

而且效果很好。

我进一步 运行 其他命令,例如

subprocess.check_output("ls", shell=True).strip()

这也很好。

这里出了什么问题?

当您设置 shell=True 时,subprocess 使用 /bin/sh 执行您的命令。在 Ubuntu 上,/bin/sh 不是 Bash,并且您使用的是 Bash-specific 语法 ([[...]])。您可以显式调用 bash 而不是:

subprocess.check_output(["/bin/bash", "-c", "[[ -z $(git status -s) ]] && echo 'clean'"]).strip()

但不清楚你为什么要在这里使用 shell 脚本:只是 运行 git status -s 和 Python,然后自己处理结果:

out = subprocess.run(['git', 'status', '-s'], stdout=subprocess.PIPE)
if not out.stdout:
  print("clean")