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 info
und man
weiter env
, verstand aber nicht zu viel.
Was env
macht und genau das env <command>
ohne Argumente für env
sich?
env <command>
,command <command>
und\<command>
. Wenn ein Test meiner Meinung nachenv <command>
ungültig ist, ist dieser Test nicht bestanden.command
oderenv
was würde `\` die einzige akzeptable Antwort.man
und habe nicht verstanden, wasenv
genau das ist. Nach diesem Beitrag - es ist klar und meine Antwort wurde überprüft (akzeptiert). Dank an alle!Antworten:
Dieser Befehl
Führt den Befehl
program and args
mit einer Umgebung aus, die durch Erweitern der aktuellen Umgebung um die Umgebungsvariablen und -werte, die mitname=value
und gekennzeichnet sind, gebildet wirdname2=value2
. Wenn Sie keine Argumente wie angebenname=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 arguments
an einen exec- Aufruf (wie execvp , der den PATH nach durchsuchtprogram
).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
env
ist es ein Alias oder eine Shell-Funktion! Wenn Sie befürchtenenv
, ein Alias zu sein, können Sie den vollständigen Pfad angeben (/usr/bin/env
auch wenn dieser möglicherweise unterschiedlich ist).quelle
Eine weitere wichtige Verwendung von
env
(abgesehen von der Umgehung der Befehls-Alias-Suche) ist die SuchePATH
nach dem Befehl. Dies ist von Bedeutung, wenn absolute Pfade erforderlich sind, diese jedoch von System zu System variieren.Zum Beispiel
#!/bin/bash
ist es in Ordnung, ein Bash-Skript mit zu beginnen#!bash
, obwohl es/bin
nicht inPATH
jedem 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 derpython
ausführbaren Datei zu vermeiden (beachten Sie jedoch, dass es immer noch erforderlich ist, dassenv
sich diese in befindet/usr/bin
, dies ist jedoch weitaus häufiger als der Speicherort der Python- Datei binär).quelle