
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.system
delega 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ándar
system()
que en Linux se define como:
int system(const char *command);
La
system()
función de biblioteca se utilizafork(2)
para crear un proceso hijo que ejecuta el comando de shell especificado encommand
el usoexecl(3)
de la siguiente manera:execl("/bin/sh", "sh", "-c", command, (char *) NULL);
En RHEL sh
es 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 dash
y seleccionando "No" en el cuadro de diálogo.