L'alias non "ignora" le voci PATH?


9

L'ultima riga della mia .bash_profileè:

alias cp=/usr/local/bin/gcp

Tuttavia, ciò viene schiacciato dalla voce nel mio $PATH:

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

Avevo pensato che gli alias abbiano la precedenza sul PATH..?


1
Per la cronaca: tecnicamente, gli alias non sovrascrivono alcun valore in PATHenvar.
can-ned_food

Avvertenza obbligatoria: in generale, non è buona norma rinominare i comandi comuni. Questo può morderti in due modi. 1) Se lavori su un altro sistema e usi il tuo comando per abitudine, otterrai il comportamento inaspettato del comando nativo. 2) Se qualcun altro utilizza il tuo sistema, anche per consigliarti / aiutarti a risolvere un problema, otterrà il comportamento inaspettato della tua personalizzazione. I comandi personalizzati vanno bene, ma non nominarli come quelli comuni esistenti.
Joe,

@joe In realtà è più il contrario qui: la versione os / x di cp manca di opzioni da nix quindi non si comporta come previsto (tranne per quelli a cui * piace la versione di
hobbled

Risposte:


21

Il whichcomando restituisce solo file eseguibili: non sa nulla sugli alias, poiché è un programma esterno e non esiste alcun meccanismo per passare le informazioni sugli alias a un processo figlio.

Se si immette il comando type -a cp, verranno visualizzate tutte le interpretazioni possibili, in ordine di preferenza. Ciò include qualsiasi alias, poiché typeè un bashcomando interno.

È importante rendersi conto che un alias non verrà interpretato da un processo secondario, come uno script o un editor interattivo che ha un'opzione per eseguire comandi di sistema.

Se si crea cpuna funzione, la versione verrà eseguita in script, anche se non da altri programmi:

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

Se vuoi cpche lavori ovunque, aggiungi $HOME/binin testa al tuo PATHelenco e $HOME/bin/cppunta ad esso:

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

Questo crea un collegamento simbolico, sebbene sia possibile renderlo un collegamento reale leggermente più efficiente (omettere -s), ma ciò richiederà normalmente i permessi di root ( sudo ln ...). La creazione di una funzione e l'aggiunta alla PATHvariabile verranno eseguite in uno degli bashscript di avvio, con autorizzazioni utente.


1
Sebbene su CentOS (e AIUI tutto RedHat) il profilo standard (a meno che non venga sovrascritto) crea un alias per whichquello che viene eseguito /usr/bin/whichcon input reindirizzato dall'output di aliase un'opzione che gli dice di leggere quell'input e usarlo per mostrare un alias se corrisponde al comando. Vedi unix.stackexchange.com/questions/10525/…
dave_thompson_085

@ dave_thompson_085 - Commento interessante: non ho usato quelle distribuzioni. Io uso Ubuntu e posso ottenere più o meno lo stesso effetto, semplicemente aliasing whicha type. Quindi which -afunziona come il programma esterno, con l'aggiunta dell'alias e delle definizioni delle funzioni. In generale non lo faccio alias which=type, perché mi piace usare $(which ProgName)quando voglio forzare l'uso di un programma esterno, bypassando qualsiasi alias o definizione di funzione.
AFH,

1
I collegamenti fisici non possono attraversare i filesystem, quindi il lnsuggerimento non simbolico funzionerà solo se la tua home directory si trova sullo stesso filesystem di /usr/local/bin. Si comporterà anche in modo strano se si aggiorna gcp, poiché il tuo hard link probabilmente farà ancora riferimento alla vecchia versione.
Inutile

@Useless - Punti validi, che è parte del motivo per cui ho modificato la mia risposta per suggerire prima un collegamento simbolico, anche se penso che le autorizzazioni siano probabilmente la considerazione più importante. Per quanto riguarda l'aggiornamento gcp, dipenderà se l'aggiornamento viene eseguito aprendo e scrivendo o eliminando e ricreando. Si noti che è irrilevante l'utilizzo di un percorso di origine assoluto o relativo per creare un collegamento reale, mentre un collegamento simbolico di solito richiede un percorso assoluto. I collegamenti sono ampiamente utilizzati nel sistema operativo e sono per lo più simbolici.
AFH,

1
@ can-ned_food - Non è semplice come impostarlo nella shell corrente: deve essere impostato in ogni script, insieme all'importazione degli alias.
AFH,

13

Gli alias sono interni alla shell. Altri programmi non li conosceranno.

whichnon è un built-in Bash (è un builtin in alcune altre shell, ad esempio zsh). Dal momento che whichnon ha informazioni privilegiate sugli alias di Bash, whichcerca solo PATHil termine indicato.

type, d'altra parte è un built-in di Bash, quindi può riferire sugli alias.


2
Inoltre, gli alias vengono espansi solo se la prima parola in un comando. Forse questo non è rilevante.
can-ned_food
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.