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
read
built-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 mkcd
all'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 command
nel bash
manuale). 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.