gpt4 book ai didi

Python subprocess.check_output 输出与同一命令的 bash 输出不同

转载 作者:行者123 更新时间:2023-12-04 18:38:53 26 4
gpt4 key购买 nike

我正在尝试使用子进程从 python 获取当前的 bash 版本。
在我的终端中,我可以使用 printf "%s\n" $SHELL获取 /bin/bashprintf "%s\n" $BASH_VERSION获取 5.1.8(1)-release .
所以我准备了这个python脚本:

>>> import subprocess
>>> subprocess.check_output(['printf "%s\n" $SHELL'], shell=True, stderr=subprocess.STDOUT)
b'/bin/bash\n'
>>> subprocess.check_output(['printf "%s\n" $BASH_VERSION'], shell=True, stderr=subprocess.STDOUT)
b'\n' <-- This output is wrong
任何人都可以解释为什么子进程中 printf $BASH_VERSION 的输出与终端输出不同?

最佳答案

BASH_VERSIONinternal variable要 bash shell,它简单地不存在于它之外。根据 https://docs.python.org/3/library/subprocess.html#popen-constructor

On POSIX with shell=True, the shell defaults to /bin/sh


因此,如果您系统上的/bin/sh 不是 bash 的别名 - 您将一无所获。要显式指定 shell,您可以调用它,或者使用 executable作为夸格。
我在我的系统上运行的一些测试,其中/bin/sh 链接到/usr/bin/bash
subprocess.check_output(['echo $BASH_VERSION'], shell=True, stderr=subprocess.STDOUT)                                                                                              
b'4.4.23(1)-release\n'

subprocess.check_output(['echo $BASH_VERSION'], shell=True, stderr=subprocess.STDOUT, executable='/bin/zsh')
b'\n'

subprocess.check_output(['echo $BASH_VERSION'], shell=True, stderr=subprocess.STDOUT, executable='/bin/bash')
b'4.4.23(1)-release\n'
请注意,在第二个示例中,我调用了 zsh没有这个变量 $SHELL变量实际上是由子shell 从您的实际shell 继承的,但这并不意味着该命令实际上是使用该SHELL 运行的。
在我的情况下,我的用户有 zsh作为默认 shell ,但正在运行
bash -c "echo $SHELL"                                                                                                                        
/usr/bin/zsh
如您所见,仍将返回 zsh

关于Python subprocess.check_output 输出与同一命令的 bash 输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70959957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com