Per correggere un bug nel comando Less annotando no.di parametri
-
22-08-2019 - |
Domanda
Questa domanda è basata su questo filo.
Il codice
function man()
{
man "$1" > /tmp/manual; less /tmp/manual
}
Problema: se utilizzo anche una sola opzione, il comando non sa dove si trova il manuale desiderato
Ad esempio,
man -k find
mi dà un errore, poiché il riferimento è sbagliato.Il comando recita -k
come il manuale.
Il mio tentativo di risolvere il problema in pseudo-codice
if no parameters
run the initial code
if one parameter
run: man "$2"
...
In altre parole, dobbiamo aggiungere un controllo delle opzioni all'inizio in modo tale che
Pseudo-codice
man $optional-option(s) "$n" > /tmp/manual; less /tmp/manual
dove $n
- n=1 se zero opzioni
- n=2 se 1 opzione
- n=3 se 2 opzioni
- ....
Come puoi effettuare un tale "controllo delle opzioni" da poter modificare il valore di $n?
Problema sviluppato: per creare due cicli if per le situazioni da n=1 a n=2
Soluzione
Che ne dite di passare tutti gli argomenti
function man()
{
man $@ > /tmp/manual; less /tmp/manual
}
Qual è il bug in meno che si parla nel titolo?
Altri suggerimenti
Innanzitutto, puoi passare tutti gli argomenti della tua funzione a man
usando $*
O $@
.Puoi leggere man sh
per i dettagli precisi sulla differenza tra i due;il racconto è da usare quasi sempre "$@"
con virgolette doppie.
In secondo luogo, il file temporaneo non è necessario.Potresti renderlo un po' più pulito collegando l'output di man
direttamente a less
:
function man() {
man "$@" | less
}
A proposito, se stai semplicemente cercando di utilizzare un cercapersone diverso (man
usi more
e tu vuoi il più elaborato less
) ce n'è uno comunemente riconosciuto PAGER
variabile di ambiente che è possibile impostare per sovrascrivere il cercapersone predefinito.Potresti aggiungere questo al tuo ~/.bashrc
ad esempio per dire a tutti i programmi di utilizzare less
quando si visualizzano più schermate di output:
export PAGER=less
Per rispondere alla tua domanda precisa, puoi controllare il numero di argomenti con $#
:
if [ $# -eq 0 ]; then
: # No arguments
elif [ $# -eq 1 ]; then
: # One argument
# etc.
Potresti anche trovare il shift
comando utile.Si rinomina $2
A $1
, $3
A $2
, e così via.Viene spesso utilizzato in un ciclo per elaborare gli argomenti della riga di comando uno per uno:
while [ $# -gt 1 ]; do
echo "Next argument is: $1"
shift
done
echo "Last argument is: $1"