it-swarm.it

Come passare i parametri a un alias?

Per lo script bash, posso usare "[email protected]" per accedere agli argomenti. Qual è l'equivalente quando uso un alias?

77
prosseek

Gli alias sono come comandi in quanto tutti gli argomenti a loro vengono passati come argomenti al programma che alias. Ad esempio, se dovessi alias ls a ls -la, quindi digitando ls foo bar avrebbe davvero eseguito ls -la foo bar dalla riga di comando.

Se si desidera avere il controllo effettivo su come vengono interpretati gli argomenti, è 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 "[email protected]"
}
54
amphetamachine

soluzione Alias

Se sei davvero contrario all'utilizzo di una funzione in sé, puoi usare:

$ alias wrap_args='f(){ echo before "[email protected]" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Puoi sostituire [email protected] con $1 se vuoi 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 della funzione quando viene eseguito l'alias in modo che non si blocchi dopo.

34
Tom Hale

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 eseguito nella directory current e fai un grep su questo - quindi usando

lsswp/tmp /

sarebbe equivalente a ls -l | grep swp /tmp/ e not 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.

19
rozcietrzewiacz

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 less si chiuderà a EOF (-e), le ricerche non faranno distinzione tra maiuscole e minuscole (-i), ecc.

15
Warren Young

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 posizioni arbitrarie del comando tar, trasformandolo in un alias tgz

1
stevica