was macht `env <befehl>`

37

Was macht der Befehl env ls -al?

Ich hatte einen Linux-Test und es stellte sich die Frage: "Wie kann ich einen Befehl direkt ausführen, aber nicht seinen Alias?"
Ich wusste, dass es eine Lösung wie das Präfixieren eines Befehls mit einem speziellen Symbol gibt, aber ich habe es vergessen. Jetzt weiß ich, dass es so ist \. (Lesen Sie aus diesem Beitrag ).

Aber ich erinnere mich auch, dass ich irgendwo gelesen habe, dass wir einem Befehl ein Präfix voranstellen können, um den Alias ​​zu entfernen env. Ich habe es getan und es scheint zu funktionieren, aber meine Antwort wurde als falsch eingestuft. Ich las infound manweiter env, verstand aber nicht zu viel.

Was envmacht und genau das env <command>ohne Argumente für envsich?

ALZ
quelle
Als Hinweis, 3 Wege, dies zu tun , die wir sind denken können env <command>, command <command>und \<command>. Wenn ein Test meiner Meinung nach env <command>ungültig ist, ist dieser Test nicht bestanden.
Patrick
@Patrick: Es ist nicht gebrochen , weil , wie Chris sagte, es auf ein Alias sein könnte commandoder envwas würde `\` die einzige akzeptable Antwort.
Pierre Arlaud
1
@ArlaudPierre und `\` sind in posix nicht definiert (als Alias-Escape), daher nicht portierbar. Es ist also nicht akzeptabler als die anderen.
Patrick
@ Patrick: wahr, wahr. Jetzt müssten wir den genauen Umfang des Tests kennen, um das zu sagen. Aber in jedem Fall, wenn Sie feststellen, dass die Antwort "env" nicht akzeptabel ist, ist das nicht sehr ehrlich. Da muss ich Ihnen zustimmen.
Pierre Arlaud
Leute, der Test wurde auch vom Menschen verifiziert (LPI-zertifizierter Ex-Sysadmin, der jetzt andere Linux lehrt) :) Ich habe mich beim Verifizierer beschwert, bin zu gegangen manund habe nicht verstanden, was envgenau das ist. Nach diesem Beitrag - es ist klar und meine Antwort wurde überprüft (akzeptiert). Dank an alle!
ALZ

Antworten:

38

Dieser Befehl

env name=value name2=value2 program and args

Führt den Befehl program and argsmit einer Umgebung aus, die durch Erweitern der aktuellen Umgebung um die Umgebungsvariablen und -werte, die mit name=valueund gekennzeichnet sind, gebildet wird name2=value2. Wenn Sie keine Argumente wie angeben name=value, wird die aktuelle Umgebung unverändert weitergegeben.

In Bezug auf Aliase ist das Wichtigste, dass env ein externer Befehl ist und daher keine Kenntnisse über Aliase besitzt: Aliase sind ein Shell-Konstrukt, das nicht Teil des normalen Prozessmodells ist und keine Auswirkungen auf Programme hat, die direkt sind von Nicht-Shell-Programmen (wie env ) ausgeführt. env übergibt das einfach program and argumentsan einen exec- Aufruf (wie execvp , der den PATH nach durchsucht program).

Grundsätzlich ist die Verwendung von env wie folgt eine (größtenteils) shellunabhängige Methode, um Aliase, Shell-Funktionen, eingebaute Shell-Befehle und andere Teile der Shell-Funktionalität zu vermeiden, die Argumente für die Position von Befehlen (dh Programmnamen) ersetzen oder überschreiben könnten. Natürlich envist es ein Alias ​​oder eine Shell-Funktion! Wenn Sie befürchten env, ein Alias ​​zu sein, können Sie den vollständigen Pfad angeben ( /usr/bin/envauch wenn dieser möglicherweise unterschiedlich ist).

Chris Johnsen
quelle
24

Eine weitere wichtige Verwendung von env(abgesehen von der Umgehung der Befehls-Alias-Suche) ist die Suche PATHnach dem Befehl. Dies ist von Bedeutung, wenn absolute Pfade erforderlich sind, diese jedoch von System zu System variieren.

Zum Beispiel #!/bin/bashist es in Ordnung, ein Bash-Skript mit zu beginnen #!bash, obwohl es /binnicht in PATHjedem vernünftigen System enthalten ist.

Ich habe dies häufig in Python-Programmen erlebt, die normalerweise damit beginnen #!/usr/bin/env python, die Angabe des vollständigen, systemabhängigen Pfads der pythonausführbaren Datei zu vermeiden (beachten Sie jedoch, dass es immer noch erforderlich ist, dass envsich diese in befindet /usr/bin, dies ist jedoch weitaus häufiger als der Speicherort der Python- Datei binär).

misberner
quelle