Para corrigir um erro no comando Menos por não notar. de parâmetros
-
22-08-2019 - |
Pergunta
Esta questão é baseada em esta discussão .
O código
function man()
{
man "$1" > /tmp/manual; less /tmp/manual
}
Problema: se eu usar até mesmo uma opção, o comando não sabe onde está o queria-manual
Por exemplo,
man -k find
me dá um erro, uma vez que a referência é errado. O comando lê -k
como o manual.
Minha tentativa de resolver o problema em pseudo-código
if no parameters
run the initial code
if one parameter
run: man "$2"
...
Em outras palavras, precisamos adicionar uma opção de verificação para o começo de tal forma que
Pseudo-código
man $optional-option(s) "$n" > /tmp/manual; less /tmp/manual
onde $ n
- n = 1 Se zero opções
- n = 2 se 1 opção
- n = 3 se 2 opções
- ....
Como você pode fazer tal uma "opção de verificação", que você pode alterar o valor de US $ n?
Desenvolvido Problema: para fazer dois se laços para as situações de n = 1 para n = 2
Solução
Que tal passar todos os argumentos
function man()
{
man $@ > /tmp/manual; less /tmp/manual
}
O que é o bug em menos que você menciona no título?
Outras dicas
Em primeiro lugar, você pode passar todos os argumentos de sua função para man
usando $*
ou $@
. Você pode ler man sh
para os detalhes precisos sobre a diferença entre os dois; história curta é usar quase sempre "$@"
com aspas duplas.
Em segundo lugar, o arquivo temporário é desnecessária. Você poderia fazer isso um pouco mais limpo canalizando a saída de man
diretamente para less
:
function man() {
man "$@" | less
}
A propósito, se você está apenas tentando usar um pager diferente (usos man
more
e você quer o less
apreciador) há uma variável de ambiente PAGER
comumente reconhecido que você pode definir para substituir o paginador padrão. Você pode adicionar este a sua ~/.bashrc
por exemplo, para dizer a todos os programas para usar less
ao exibir várias telas de saída:
export PAGER=less
Para responder à sua pergunta precisa, você pode verificar o número de argumentos com $#
:
if [ $# -eq 0 ]; then
: # No arguments
elif [ $# -eq 1 ]; then
: # One argument
# etc.
Você também pode encontrar o comando shift
útil. Ele renomeia $2
para $1
, $3
para $2
, e assim por diante. Ele é frequentemente usado em um loop para argumentos processo de linha de comando, um por um:
while [ $# -gt 1 ]; do
echo "Next argument is: $1"
shift
done
echo "Last argument is: $1"