Bash $_ en Python os.system

Bash $_ en Python os.system

Me acabo de encontrar con lo siguiente

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

para RHEL, esto da lo que espero ( $_se expande a hello):

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

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

pero para Ubuntu (WSL) no:

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

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

¿porqué es eso?

Respuesta1

os.systemdelega a la system()función C:

os.system(command)

Ejecute el comando (una cadena) en una subcapa. Esto se implementa llamando a la función C estándarsystem()

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

que en Linux se define como:

int system(const char *command);

La system()función de biblioteca se utiliza fork(2)para crear un proceso hijo que ejecuta el comando de shell especificado en command el uso execl(3)de la siguiente manera:

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

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

En RHEL shes bash, pero en Ubuntu es dash.

$_no está definido en dash, es una funcionalidad bash, de ahí la discrepancia.

En Ubuntu/Debian Puede configurar bash-as-sh usando sudo dpkg-reconfigure dashy seleccionando "No" en el cuadro de diálogo.

información relacionada