Python os.system 中的 Bash $_

Python os.system 中的 Bash $_

我刚刚遇到了以下问题

grep -h ^ID= /etc/*-release
python -c 'from os import system; system("echo hello; echo $_")'

对于 RHEL,这给出了我期望的结果($_扩展为hello):

$ grep -h ^ID= /etc/*-release
ID="rhel"

$ python -c 'from os import system; system("echo hello; echo $_")'
hello
hello

但对于 Ubuntu(WSL)则不是:

$ grep -h ^ID= /etc/*-release
ID=ubuntu

$ python -c 'from os import system; system("echo hello; echo $_")'
hello
/usr/bin/python

这是为什么?

答案1

os.system委托给 Csystem()函数:

os.system(command)

在子 shell 中执行命令(字符串)。这是通过调用标准 C 函数实现的system()

--https://docs.python.org/3/library/os.html#os.system

在 Linux 上定义为:

int system(const char *command);

system()库函数用于创建一个子进程,执行 usingfork(2)中指定的shell命令,如下所示:commandexecl(3)

execl("/bin/sh", "sh", "-c", command, (char *) NULL);

--https://man7.org/linux/man-pages/man3/system.3.html

在 RHEL 上shbash,但在 Ubuntu 上是dash

$_在中未定义dash,它是 bash 功能,因此存在差异。

在 Ubuntu/Debian 上,您可以使用设置 bash-as-shsudo dpkg-reconfigure dash并在对话框中选择“否”。

相关内容