Bash $_ в Python os.system

Bash $_ в Python os.system

Я только что столкнулся со следующим

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делегирует функцию C system():

os.system(command)

Выполнить команду (строку) в подоболочке. Это реализуется вызовом стандартной функции Csystem()

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

который в Linux определяется как:

int system(const char *command);

Библиотечная system()функция используется fork(2)для создания дочернего процесса, который выполняет команду оболочки, указанную в command using execl(3)следующим образом:

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

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

В RHEL shэто bash, а в Ubuntu это dash.

$_не определено в dash, это функционал bash, отсюда и несоответствие.

В Ubuntu/Debian вы можете установить bash-as-sh sudo dpkg-reconfigure dash, выбрав «Нет» в диалоговом окне.

Связанный контент