
Ich bin gerade auf Folgendes gestoßen
grep -h ^ID= /etc/*-release
python -c 'from os import system; system("echo hello; echo $_")'
für RHEL ergibt dies, was ich erwarte ( $_
erweitert sich zu hello
):
$ grep -h ^ID= /etc/*-release
ID="rhel"
$ python -c 'from os import system; system("echo hello; echo $_")'
hello
hello
aber für Ubuntu (WSL) nicht:
$ grep -h ^ID= /etc/*-release
ID=ubuntu
$ python -c 'from os import system; system("echo hello; echo $_")'
hello
/usr/bin/python
Warum das?
Antwort1
os.system
delegiert an die C- system()
Funktion:
os.system(command)
Führen Sie den Befehl (einen String) in einer Subshell aus. Dies wird durch den Aufruf der Standard-C-Funktion
system()
was unter Linux wie folgt definiert ist:
int system(const char *command);
Die
system()
Bibliotheksfunktion verwendet ,fork(2)
um einen untergeordneten Prozess zu erstellen, der den incommand
using angegebenen Shell-Befehlexecl(3)
wie folgt ausführt:execl("/bin/sh", "sh", "-c", command, (char *) NULL);
Unter RHEL sh
ist es bash
, unter Ubuntu jedoch dash
.
$_
ist in nicht definiert dash
, es ist eine Bash-Funktionalität, daher die Diskrepanz.
Unter Ubuntu/Debian können Sie Bash als Sh festlegen sudo dpkg-reconfigure dash
, indem Sie im Dialogfeld „Nein“ auswählen.