No Linux semelhante ao Ubuntu, o .bashrc
arquivo padrão contém uma linha:
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
Então por que é SHELL=/bin/sh lesspipe
gramaticalmente correto? Em que página man bash
posso saber o significado desta afirmação? Para mim, esta afirmação parece a mesma que, por exemplo,
ls echo
, que é inválido. Também,
abc=hello echo $abc
não comete nenhum erro, mas gera null.
Não consegui encontrar nenhuma informação relevante, man bash
embora tenha tentado algum /<expression>
comando de pesquisa no less
. Alguém poderia me dizer as interpretações do comando?
Nota: eu li o post " Você pode explicar a expressão eval no .bashrc padrão " mas não recebi nada.
Como o steeldriver disse,
SHELL=/bin/sh lesspipe
é um comando simples , que é definido como uma sequência de:SHELL=/bin/sh
), seguidas por...lesspipe
(aqui ), terminados por...Seu primeiro exemplo:
é na verdade um comando válido: apenas a primeira palavra é tratada como um comando a ser executado, o restante é dado a esse comando como parâmetros¹.
No caso de um
ls
comando, se houver um subdiretório nomeadoecho
no diretório atual, seu conteúdo será listado; se houver um não diretório chamadoecho
, seu nome será exibido². Se nenhum for verdadeiro, o comando retornará um erro e exibirá umaNo such file or directory
mensagem de erro.Seu segundo exemplo:
é novamente um comando simples com uma atribuição de variável, mas também inclui uma expansão de variável (
$abc
). O capítulo EXPANSÃOman bash
define os vários tipos de expansão e sua ordem de operação.Após a linha de comando ser dividida em palavras, o shell verifica as expansões:
$abc
é substituído pelo valor atual do shell ou variável de ambiente chamadaabc
. Mas como essa linha de comando ainda não foi executada, a atribuição de variável anterior na linha (abc=hello
) ainda não está em vigor. Como resultado,$abc
é substituído por qualquer valor queabc
tenha antes, ou por uma string vazia se não tiver sido definida. A string vazia é removida completamente, pois não foi citada.$abc
expansão da variável, mas não há nada para dividir em uma string nula.Uma vez que as expansões são feitas, a variável
abc
no ambiente do utilitário a ser iniciado é definida com o valor "hello" e o comandoecho
é executado. Ele gera apenas uma única linha em branco.¹ estritamente falando,
ls
também é passado como argumento, como seuargv[0]
.ls
usa esse argumento para saber como ele foi invocado, usa-o também nas mensagens de erro que gera, mas não o considera como uma opção ou arquivo para agir.² se for um link simbólico, mas seu destino não puder ser resolvido, algumas
ls
implementações, no entanto, emitirão uma mensagem de erro como se o arquivo não existisse