2010-10-30 20 views

risposta

171

Un alias si espanderà alla stringa che rappresenta. Qualsiasi cosa dopo l'alias apparirà dopo la sua espansione senza aver bisogno di essere o essere in grado di passare come argomenti espliciti (ad esempio $1).

$ alias foo='/path/to/bar' 
$ foo some args 

otterrà ampliato per

$ /path/to/bar some args 

Se si desidera utilizzare argomenti espliciti, è necessario utilizzare una funzione verrà eseguita

$ foo() { /path/to/bar "[email protected]" fixed args; } 
$ foo abc 123 

come se si fosse fatto

$ /path/to/bar abc 123 fixed args 

Per indefinire un alias:

unalias foo 

da non definire una funzione:

unset -f foo 

Per visualizzare il tipo e la definizione (per ogni alias definiti, parola chiave, la funzione di file, incorporato o eseguibile):

type -a foo 

Oppure digita solo (per la più alta occorrenza):

type -t foo 
+7

Voglio solo aggiungere un esempio dal mio .bashrc mkcd() {mkdir "$ @" && cd "$ @"; } dove sto creando dir e cd'ing in –

+0

Si dovrebbe colorare anche "abc" in rosso poiché $ @ = lista di argomenti passati alla funzione. – 10basetom

+3

@ 10basetom: se ti riferisci ai colori nella mia risposta, ciò viene fatto automaticamente dall'evidenziatore della sintassi. –

16

Di solito quando mi voglio passare argomenti ad un alias in Bash, io uso una combinazione di un alias e una funzione come questa, ad esempio:

function __t2d {                 
     if [ "$1x" != 'x' ]; then            
      date -d "@$1"              
     fi                  
} 

alias t2d='__t2d'                
+1

Per che cosa è sempre questa falsa istruzione 'se'? –

+0

corretto. Era un errore di battitura, mi dispiace. era davvero pensato per verificare l'esistenza di $ 1 – leed25d

+16

'[-n" $ 1 "]' (l'uso di "x" in questo modo è arcaico e inutile per qualsiasi shell moderna) –

-3

Per semplificare la risposta di leed25d, utilizzare una combinazione di un alias e una funzione. Ad esempio:

function __GetIt { 
    cp ./path/to/stuff/$* . 
} 

alias GetIt='__GetIt' 
14

da utilizzare parametri alias, io uso questo metodo:

alias myalias='function __myalias() { echo "Hello $*"; unset -f __myalias; }; __myalias' 

sua una funzione di auto-distruttiva avvolto in un alias, quindi praticamente è il migliore dei due mondi, e non prende una riga in più nelle tue definizioni ... che odio, oh sì e se hai bisogno di quel valore di ritorno, dovrai salvarlo prima di chiamare unset, e poi restituire il valore usando "return "parola chiave in quella funzione autodistruttiva lì:

alias myalias='function __myalias() { echo "Hello $*"; myresult=$?; unset -f __myalias; return $myresult; }; __myalias' 

così ..

si potrebbe, se è necessario disporre di quella variabile in là

alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb' 

naturalmente ...

alias mongodb='./path/to/mongodb/' 

sarebbe in realtà fare la stessa cosa senza la necessità di parametri, ma come ho detto, se si voleva o bisogno per qualche motivo (ad esempio, è necessario $ 2 invece di $ 1), si avrebbe bisogno di utilizzare un involucro del genere. Se è più grande di una linea potresti considerare di scrivere una funzione a titolo definitivo poiché diventerebbe più un pugno nell'occhio man mano che diventerà più grande. Le funzioni sono grandi poiché si ottengono tutti i vantaggi che le funzioni danno (vedere completamento, trap, binding, ecc. Per i gadget che le funzioni possono fornire, nella manpage di bash).

spero che ti aiuta :)

+2

~ $ alias myalias = 'function __myalias() {echo "Hello $ *"; unset -f __myalias; } __myalias ' ~ $ myalias -bash: errore di sintassi vicino a token imprevisto '__myalias' – JeeBee

+0

Questo è orribile! stai ridefinendo la funzione ogni volta? (Non posso nemmeno preoccuparmi di controllare se ci sono errori di sintassi lì). –

+0

Non è che debbano farlo ESATTAMENTE in questo modo, doveva essere un esempio, e sì è ridefinito ogni volta, che lo mantiene su una riga, altrimenti non sarebbe un colpo unico ? È come lamentarsi che "alias" si espande ogni volta al suo contenuto assegnato, com'è diverso? E non c'è bisogno di essere così emotivo. – osirisgothra

3

In csh (al contrario di bash) si può fare esattamente quello che vuoi.

alias print 'lpr \!^ -Pps5' 
print memo.txt 

La notazione \!^ provoca l'argomento da inserire nel comando a questo punto.

Il carattere ! è preceduto da un \ per impedire che venga interpretato come un comando storia.

È inoltre possibile passare più argomenti

alias print 'lpr \!* -Pps5' 
print part1.ps glossary.ps figure.ps 

(esempi presi da http://unixhelp.ed.ac.uk/shell/alias_csh2.1.html.)

+0

Grazie! Io uso 'csh' al lavoro e questa è la prima volta che l'ho apprezzato! –

5

Questa è la soluzione che può evitare di utilizzare la funzione:

alias addone='{ num=$(cat -); echo "input: $num"; echo "result:$(($num+1))"; }<<<' 

risultato

addone 200 
input: 200 
result:201 
+0

Ha funzionato perfettamente per me. Volevo passare il numero del colore (da 31 a 37) al comando PS nel mio alias. Ho fatto qualcosa di simile a questo: alias psany = '{PS1 = "\ e [0; $ (cat -) m> \ e [m";} <<<' UTILIZZO: psany 32 – zviad

Problemi correlati