Posso passare argomenti a un comando alias?


19

Voglio sapere se posso passare un argomento con un comando alias.

per esempio:

alias d="dmesg|grep -iw usb|tail -5" 

Ora dstamperà le ultime 5 righe. Se si desidera utilizzare d per stampare un numero diverso di righe, è necessario modificare dnuovamente la dichiarazione del comando alias .

Esiste un modo per modificare la dichiarazione di un alias in modo da non dover digitare nuovamente la dichiarazione per modificare il numero di righe. Come incorporare il passaggio del numero di righe come argomento mentre si dichiara alias per d? O c'è qualche altro metodo per risolvere questo?


In (t) csh, "\! *" Fa riferimento ad argomenti con un alias (la barra rovesciata serve solo a sfuggire al punto esclamativo che normalmente significa "storia") e puoi persino fare riferimento a singoli argomenti, anche se non ricordo come. Quindi forse "tail -n \! *" O qualcosa del genere (non credo che \! * Funzionerà con un segno meno immediatamente prima di esso). Tuttavia, non sono sicuro se questo funzionerà in (ba) sh.
Barrycarter,

Risposte:


20

Gli alias non accettano argomenti. Con un alias simile alias foo='bar $1', $1verrà espanso dalla shell al primo argomento della shell (che è probabilmente nulla) quando viene eseguito l'alias.

Quindi: utilizzare invece le funzioni .

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} utilizza il primo argomento, con un valore predefinito di 5 se non viene fornito.

Quindi puoi fare:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

Oppure, se si modificano leggermente le opzioni utilizzate:

alias d="dmesg|grep -iw usb|tail -n 5"

Quindi puoi passare ulteriori -nopzioni:

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

Se -nvengono specificate più opzioni per tail, viene utilizzata solo l'ultima.


Per la funzionalmente sfidato come me :) potrebbe essere utile a stato brevemente dove mettere la funzione ... cioè ~/.bashrco rc.localo dovunque?
WinEunuuchs2Unix

@ WinEunuuchs2Unix ovunque sarebbe stato messo l'alias.
Muru,

5

È necessario disporre di una funzione per questo, come descritto nella comunicazione degli addebiti e qui . Prova quanto segue:

foo() { /path/to/command "$@" ;}

e chiama il foocon:

foo arg1 arg2 arg3

4

Aggirare le limitazioni degli alias con il comando di gruppo e here-string

Gli alias non possono accettare argomenti, ma possiamo "simularli". Prendi ad esempio un esempio della mia risposta a questa domanda .

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

Punti chiave che stanno accadendo qui:

  • usiamo readbuilt-in per leggere una stringa in una variabile d. Poiché vogliamo leggere una stringa completa che includa caratteri vuoti (newline, tab, spazi), utilizziamo IFS=e disabilitiamo le escape backslash con -r.
  • <<<che è l' operatore stringa qui ci consente di reindirizzare qualsiasi stringa che forniamo come argomento mkcdall'alias; l'uso sarebbe comemkcd "some directory"
  • più comandi all'interno dell'alias vengono combinati ed eseguiti nella shell corrente utilizzando la { list; }struttura (che è nota come group commandnel bashmanuale). Si noti che sono richiesti spazi iniziali dopo {ed ;elenco individuale di comandi.

Nel tuo esempio specifico potremmo fare:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

Potremmo anche utilizzare la suddivisione delle parole per memorizzare argomenti separati da spazio:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

Oppure potremmo usare gli array per fornire più argomenti:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

Ma è un buon approccio?

Non necessariamente. Il problema con tale approccio è che è molto specifico: gli argomenti non possono essere citati facilmente, il che significa che possiamo avere solo argomenti senza spazi.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

Questo ovviamente non è qualcosa che sarebbe ampiamente usato, semplicemente perché nel mondo reale dobbiamo affrontare argomenti complessi, quindi questo approccio non è del tutto pratico. Le funzioni sono molto più flessibili. E la necessità di citare la stringa args diventa fastidiosa in fretta.

Nonostante i limiti, questo funziona con semplici stringhe come argomenti in cui possiamo permetterci la divisione delle parole, quindi in parte ci consente di fornire argomenti agli alias.

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.