Alias ​​"überschreibt" keine PATH-Einträge.

1709
javadba

Die letzte Zeile von mir .bash_profileist:

alias cp=/usr/local/bin/gcp 

Das wird jedoch durch den Eintrag in meinem gequetscht $PATH:

$which cp /bin/cp 11:54:32/OCspark $type cp cp is aliased to `/usr/local/bin/gcp' 

Ich hatte gedacht, dass Aliase die PATH.. überschreiben .

8
Für das Protokoll: Technisch überschreiben Aliase keine Werte in der 'PATH'-Envar. can-ned_food vor 6 Jahren 1
Obligatorische Vorsicht: Im Allgemeinen ist es nicht empfehlenswert, allgemeine Befehle umzubenennen. Dies kann Sie auf zwei Arten beißen. 1) Wenn Sie an einem anderen System arbeiten und Ihren Befehl aus Gewohnheit verwenden, wird das unerwartete Verhalten des systemeigenen Befehls angezeigt. 2) Wenn jemand anderes Ihr System verwendet, sogar um Sie zu beraten / Ihnen bei der Lösung eines Problems behilflich zu sein, wird das unerwartete Verhalten Ihrer Anpassung angezeigt. Benutzerdefinierte Befehle sind in Ordnung, benennen Sie sie nicht einfach wie gewöhnliche vorhandene. Joe vor 6 Jahren 0
@Joe Eigentlich ist es mehr von der * umgekehrten * hier: der os / x-Version von * cp * fehlen die Optionen von * nix, so dass sie sich nicht wie erwartet verhält (außer für diejenigen, die * die * gefälschte Mac-Version mögen) javadba vor 6 Jahren 0

2 Antworten auf die Frage

20
AFH

Der whichBefehl gibt nur ausführbare Dateien zurück: Er kennt keine Aliase, da es sich um ein externes Programm handelt und es keinen Mechanismus gibt, um Aliasinformationen an einen untergeordneten Prozess zu übergeben.

Wenn Sie den Befehl eingeben type -a cp, werden alle möglichen Interpretationen in der bevorzugten Reihenfolge angezeigt. Dies schließt alle Aliasnamen ein, da typees sich um einen bashinternen Befehl handelt.

Es ist wichtig zu wissen, dass ein Alias ​​nicht von einem Unterprozess wie einem Skript oder einem interaktiven Editor interpretiert wird, der die Option zum Ausführen von Systembefehlen hat.

Wenn Sie cpeine Funktion erstellen, wird Ihre Version in Skripts ausgeführt, jedoch nicht von anderen Programmen:

cp() { /usr/local/bin/gcp "$@"; } 

Wenn Sie möchten, dass Sie cpüberall arbeiten, fügen Sie $HOME/binden Anfang Ihrer PATHListe hinzu und zeigen Sie $HOME/bin/cpauf einen Punkt:

ln -s /usr/local/bin/gcp $HOME/bin/cp 

Dadurch wird ein symbolischer Link erstellt, obwohl Sie einen etwas effizienteren Hardlink (auslassen -s) erstellen können. Normalerweise benötigen Sie dazu jedoch root-Berechtigungen ( sudo ln ...). Das Erstellen einer Funktion und das Hinzufügen der PATHVariablen erfolgt in einem der bashStartskripts mit Benutzerberechtigungen.

Obwohl auf CentOS (und AIUI alle RedHat) das Standardprofil (sofern nicht überschrieben) ein _alias_ erstellt, wird für `which`, das` / usr / bin / which 'ausgeführt wird, wobei die Eingabe von der Ausgabe von `alias` und von einer Option geleitet wird, die es anweist Lesen Sie diese Eingabe und verwenden Sie sie, um einen Alias ​​anzuzeigen, wenn er mit dem Befehl übereinstimmt. Siehe https://unix.stackexchange.com/questions/10525/how-to-use-which-on-andalas-command dave_thompson_085 vor 6 Jahren 1
@ dave_thompson_085 - Interessanter Kommentar: Ich habe diese Distributionen nicht verwendet. Ich benutze Ubuntu und ich kann den gleichen Effekt erzielen, indem ich einfach "which" auf "type" verweise. Dann funktioniert "which -a" wie das externe Programm mit den Alias- und Funktionsdefinitionen. Im Allgemeinen verwende ich kein Alias ​​which = type, da ich gerne $ (which ProgName) benutze, wenn ich die Verwendung eines externen Programms erzwingen möchte, wobei Alias- oder Funktionsdefinitionen umgangen werden. AFH vor 6 Jahren 0
Hardlinks können Dateisysteme nicht kreuzen, daher funktioniert der nicht-symbolische `ln`-Vorschlag nur, wenn sich das Basisverzeichnis im selben Dateisystem befindet wie` / usr / local / bin`. Es wird sich auch merkwürdig verhalten, wenn Sie `gcp` aktualisieren, da Ihr Hardlink wahrscheinlich immer noch auf die alte Version verweist. Useless vor 6 Jahren 1
@Useless - Gültige Punkte. Dies ist ein Teil des Grunds, aus dem ich meine Antwort bearbeitet habe, um zunächst einen symbolischen Link vorzuschlagen, obwohl ich denke, dass die Berechtigungen wahrscheinlich die wichtigste Überlegung sind. Bei der Aktualisierung von "gcp" hängt es davon ab, ob die Aktualisierung durch Öffnen und Schreiben oder durch Löschen und Neuerstellen erfolgt. Beachten Sie, dass es unerheblich ist, ob ein absoluter oder relativer Quellpfad zum Erstellen eines Hardlinks verwendet wird, während ein symbolischer Link normalerweise einen absoluten Pfad benötigt. Verknüpfungen werden im Betriebssystem umfangreich verwendet und sind meistens symbolisch. AFH vor 6 Jahren 0
Natürlich können Aliase auch in Skripten erweitert werden, wenn die Shell-Option "expand_aliases" gesetzt ist. can-ned_food vor 6 Jahren 0
@ can-ned_food - Es ist nicht so einfach, es in der aktuellen Shell zu setzen: Es muss in jedem Skript festgelegt werden, zusammen mit dem Import der Aliase. AFH vor 6 Jahren 1
@AFH Guter Punkt. Ich mache das alles mit meinem Shell-Variablenwert `BASH_ENV`. Ein bisschen langsam, ja, aber es gibt mir eine gute Plattform mit weniger Überraschungen. can-ned_food vor 6 Jahren 0
13
8bittree

Aliase sind intern in der Shell. Andere Programme wissen nichts davon.

whichist kein Bash Builtin (es ist ein Buildin in anderen Shells, zB Zsh). Da whiches keine privilegierten Informationen in Bashs Aliasnamen gibt, suchen Sie whicheinfach nach PATHdem angegebenen Begriff.

typeAuf der anderen Seite ist ein Bash eingebaut, sodass Aliasnamen gemeldet werden können.

Außerdem werden Aliase nur beim ersten Wort eines Befehls erweitert. Vielleicht ist das nicht relevant. can-ned_food vor 6 Jahren 2