Risposte:
Gli alias sono come comandi in quanto tutti gli argomenti a loro vengono passati come argomenti al programma che alias. Per esempio, se si dovesse alias ls
per ls -la
, quindi digitando ls foo bar
sarebbe davvero l'esecuzione ls -la foo bar
sulla riga di comando.
Se si desidera avere il controllo effettivo sul modo in cui gli argomenti vengono interpretati, è possibile scrivere una funzione in questo modo:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
Soluzione alias
Se sei davvero contrario all'utilizzo di una funzione in sé, puoi usare:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
È possibile sostituire $@
con $1
se si desidera solo il primo argomento.
Spiegazione
Questo crea una funzione temporanea f
, a cui vengono passati gli argomenti.
Gli argomenti alias vengono passati solo alla fine. Si noti che f
viene chiamato alla fine dell'alias.
Il unset -f
rimuove la definizione di funzione come alias viene eseguito in modo da non rimanere in giro dopo.
wrap_args x y z
mi dà: bash: errore di sintassi vicino token inaspettato `('
f
alias. Una volta che ho fatto l'alienazione f
, funziona bene. La vecchia cosa della collisione del nome.
command type f
:)
Aggiungendo alle risposte attuali, una cosa importante da capire su come funzionano gli alias è che tutti i parametri digitati dopo un comando con alias verranno usati letteralmente alla fine. Quindi non c'è modo di usare l'alias per due comandi (convogliati o meno), dai quali il primo dovrebbe interpretare i parametri. Per chiarire, ecco un esempio di qualcosa che non funzionerebbe come previsto:
alias lsswp="ls -l | grep swp"
(un esempio ispirato a questa domanda ) questo utilizzerà sempre l'output di ls -l
performato nella directory corrente e farà un grep su quello - quindi usando
lsswp / tmp /
sarebbe equivalente ls -l | grep swp /tmp/
e non ls -l /tmp/ | grep swp
.
Per tutti gli scopi in cui gli argomenti dovrebbero essere usati da qualche parte nel mezzo, è necessario usare un function
invece di alias
.
In realtà non devi fare nulla; gli alias lo fanno automaticamente. Per esempio:
$ alias less="less -eirqM"
$ less foo.txt
Vedrai la prima pagina di foo.txt e uscirai da less
EOF (-e), le ricerche non faranno distinzione tra maiuscole e minuscole (-i), ecc.
Sto rispondendo per csh:
Sì, puoi usare i parametri negli alias e - come differenza rispetto a quanto detto sopra - puoi fare riferimento a loro ovunque nella definizione di alias - non solo alla fine.
Esempio per tar-gz -ing qualcosa:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, dove !:1
e !:2
sono i parametri che fornirai quando chiami il tuo alias.
Esempio di utilizzo:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
Il che significa effettivamente che hai usato due parametri che hai inserito in punti arbitrari del comando tar, trasformandolo in un alias tgz
sh
sono definitemy_program_wrapper() { ...; }
. Bash gestisce la parola chiave,function
ma perché non andare con ciò che è più portatile?