Alias ​​überschreibt keine PATH-Einträge?

9

Die letzte Zeile von mir .bash_profileist:

alias cp=/usr/local/bin/gcp

Dies wird jedoch durch den Eintrag in meinem $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..?

Javadba
quelle
1
Für das Protokoll: technisch, Aliase Sie nicht überschreiben alle Werte in der PATHenvar.
can-ned_food
Obligatorische Vorsicht: Im Allgemeinen ist es nicht empfehlenswert, allgemeine Befehle umzubenennen. Dies kann Sie auf zwei Arten beißen. 1) Wenn Sie auf einem anderen System arbeiten und Ihren Befehl aus Gewohnheit verwenden, erhalten Sie das unerwartete Verhalten des nativen Befehls. 2) Wenn jemand anderes Ihr System verwendet, um Sie bei der Lösung eines Problems zu beraten / zu unterstützen, wird er das unerwartete Verhalten Ihrer Anpassung erhalten. Benutzerdefinierte Befehle sind in Ordnung, benennen Sie sie jedoch nicht wie die üblichen vorhandenen.
Joe
@joe Eigentlich ist es hier eher umgekehrt : der os / x-Version von cp fehlen Optionen von nix, so dass sie sich nicht wie erwartet verhält (außer für diejenigen, die * die humpelnde Mac-Version
mögen

Antworten:

21

Der whichBefehl gibt nur ausführbare Dateien zurück: Er weiß nichts über Aliase, da es sich um ein externes Programm handelt und es keinen Mechanismus zum Übergeben von Aliasinformationen an einen untergeordneten Prozess gibt.

Wenn Sie den Befehl eingeben type -a cp, werden alle möglichen Interpretationen in der Reihenfolge ihrer Präferenz angezeigt. Dies schließt jeden Alias ​​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 bietet.

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

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

Wenn Sie möchten, dass Sie cpüberall arbeiten, fügen Sie $HOME/binam Anfang Ihrer PATHListe hinzu und zeigen $HOME/bin/cpSie darauf:

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

Dies macht einen symbolischen Link, obwohl Sie ihn zu einem etwas effizienteren Hardlink machen können (weglassen -s), aber dies erfordert normalerweise Root-Berechtigungen ( sudo ln ...). Das Erstellen einer Funktion und das Hinzufügen zur PATHVariablen erfolgt in einem der bashStartskripts mit Benutzerberechtigungen.

AFH
quelle
1
Obwohl auf CentOS (und AIUI alle RedHat) das Standardprofil (wenn sie nicht ersetzt) ein schafft Alias für whichdas läuft /usr/bin/whichverrohrt mit Eingang vom Ausgang der aliasund eine Option , die es , dass die Eingabe zu lesen erzählt und es verwenden , einen Aliasnamen zu zeigen , wenn es die Spiele Befehl. Siehe unix.stackexchange.com/questions/10525/…
dave_thompson_085
@ dave_thompson_085 - Interessanter Kommentar: Ich habe diese Distributionen nicht verwendet. Ich benutze Ubuntu und ich kann einfach durch Aliasing viel den gleichen Effekt whichzu type. Funktioniert dann which -awie das externe Programm, wobei die Alias- und Funktionsdefinitionen hinzugefügt werden. Im Allgemeinen nicht alias which=type, weil ich es gerne verwende, $(which ProgName)wenn ich die Verwendung eines externen Programms unter Umgehung von Alias- oder Funktionsdefinitionen erzwingen möchte.
AFH
1
Harte Links können keine Dateisysteme überqueren, daher lnfunktioniert der nicht symbolische Vorschlag nur, wenn sich Ihr Home-Verzeichnis im selben Dateisystem befindet wie /usr/local/bin. Es verhält sich auch merkwürdig, wenn Sie aktualisieren gcp, da Ihr fester Link wahrscheinlich immer noch auf die alte Version verweist.
Nutzlos
@Useless - Gültige Punkte, weshalb ich meine Antwort so bearbeitet habe, dass zuerst ein symbolischer Link vorgeschlagen wird, obwohl ich denke, dass die Berechtigungen wahrscheinlich die wichtigste Überlegung sind. Die Aktualisierung gcphängt davon ab, ob die Aktualisierung durch Öffnen und Schreiben oder durch Löschen und erneutes Erstellen erfolgt. Beachten Sie, dass es unerheblich ist, ob ein absoluter oder relativer Quellpfad zum Erstellen einer festen Verbindung verwendet wird, während eine symbolische Verknüpfung normalerweise einen absoluten Pfad benötigt. Links werden im Betriebssystem häufig verwendet und sind meist symbolisch.
AFH
1
@ can-ned_food - Es ist nicht so einfach wie das Festlegen in der aktuellen Shell: Es muss in jedem Skript festgelegt werden, zusammen mit dem Importieren der Aliase.
AFH
13

Aliase sind in der Shell enthalten. Andere Programme wissen nichts darüber.

whichist kein eingebauter Bash (es ist ein eingebauter Bash in einigen anderen Shells, z. B. zsh). Da whichkeine privilegierten Informationen in Bashs Aliasnamen enthalten sind, wird whichnur nach PATHdem angegebenen Begriff gesucht .

typeAuf der anderen Seite ist ein Bash eingebaut, so dass er über Aliase berichten kann.

8bittree
quelle
2
Außerdem werden Aliase nur erweitert, wenn das erste Wort in einem Befehl vorhanden ist. Vielleicht ist das nicht relevant.
can-ned_food