Come passare i parametri a un alias?


64

Per bash script, posso usare "$@"per accedere agli argomenti. Qual è l'equivalente quando uso un alias?

Risposte:


50

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 lsper ls -la, quindi digitando ls foo barsarebbe davvero l'esecuzione ls -la foo barsulla 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 "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/… Le funzioni in shsono definite my_program_wrapper() { ...; }. Bash gestisce la parola chiave, functionma perché non andare con ciò che è più portatile?
effimero

2
@ephemient Molto vero. Voglio dire oltre al fatto che tutti usano GNU Bash e non la shell POSIX barebone.
anfetamachina,

21

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 $1se 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 fviene chiamato alla fine dell'alias.

Il unset -frimuove la definizione di funzione come alias viene eseguito in modo da non rimanere in giro dopo.


Humm? wrap_args x y zmi dà: bash: errore di sintassi vicino token inaspettato `('
Vista ellittica il

@Elipticalview Hmm, copia incolla problema? Lavoro confermato su bash 4.4.12.
Tom Hale,

1
Ho avuto falias. Una volta che ho fatto l'alienazione f, funziona bene. La vecchia cosa della collisione del nome.
Vista ellittica il

command type f:)
Tom Hale,

1
grande! questa è la variante più pigra!
Sergio,

19

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 -lperformato 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 functioninvece di alias.


15

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 lessEOF (-e), le ricerche non faranno distinzione tra maiuscole e minuscole (-i), ecc.


Puoi per favore guardare la mia domanda : nessuna delle soluzioni funziona per me e non mi è permesso iniziare una taglia.
JJD

1
@JJD Chi ha risposto alla tua domanda è corretto: in quel caso vuoi una funzione, non un alias. Poiché la risposta accettata a questa domanda è essenzialmente la stessa, la tua domanda è stata giustamente chiusa.
Warren Young,

1

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 !:1e !:2sono 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

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.