我刚刚遇到了以下问题
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()
在 Linux 上定义为:
int system(const char *command);
该
system()
库函数用于创建一个子进程,执行 usingfork(2)
中指定的shell命令,如下所示:command
execl(3)
execl("/bin/sh", "sh", "-c", command, (char *) NULL);
在 RHEL 上sh
是bash
,但在 Ubuntu 上是dash
。
$_
在中未定义dash
,它是 bash 功能,因此存在差异。
在 Ubuntu/Debian 上,您可以使用设置 bash-as-shsudo dpkg-reconfigure dash
并在对话框中选择“否”。