No bash, por que o 'SHELL = / bin / sh lesspipe' 'está gramaticalmente correto? [duplicado]

0

No linux do tipo Ubuntu, o arquivo .bashrc 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? Qual página de man bash posso saber o significado dessa afirmação? Para mim, esta afirmação parece a mesma que, por exemplo,

ls echo

, que é inválido. Além disso,

abc=hello echo $abc

não apresenta erros, mas gera valores nulos.

Não encontrei nenhuma informação relevante em man bash , embora tenha tentado algum comando /<expression> search em less . Alguém poderia me dizer as interpretações do comando?

Nota: Li o post " Você pode Explique a expressão eval no padrão .bashrc "mas não obtém nada.

    
por ynn 13.08.2018 / 17:22

1 resposta

2

Como o steeldriver disse, SHELL=/bin/sh lesspipe é um comando simples , que é definido como uma sequência de:

  • atribuições de variáveis opcionais (aqui SHELL=/bin/sh ), seguidas por ...
  • Palavras e redirecionamentos em branco -separados (aqui lesspipe ), terminados por ...
  • um operador de controle , que inclui um caractere de nova linha.

Seu primeiro exemplo:

ls echo

é na verdade um comando válido: somente a primeira palavra é tratada como um comando para executar, o resto é dado a esse comando como parâmetros¹.

No caso de um comando ls , se houver um subdiretório chamado echo no diretório atual, seu conteúdo será listado; se houver um diretório não denominado echo , seu nome será exibido². Se nenhum dos dois for verdadeiro, o comando retornará um erro e exibirá uma mensagem de erro No such file or directory .

Seu segundo exemplo:

abc=hello echo $abc

é 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ÃO de man bash define os vários tipos de expansão e sua ordem de operações.

Após a linha de comando ter sido dividida em palavras, o shell verifica as expansões:

  • expansão de chave: nada aplicável
  • expansão do til: nada aplicável
  • expansão de parâmetro e variável: aqui $abc é substituído pelo valor atual da variável shell ou ambiente denominada abc . Mas como esta linha de comando ainda não foi executada, a atribuição de variáveis anteriormente na linha ( abc=hello ) ainda não está em vigor. Como resultado, $abc é substituído pelo valor que abc possuía antes, ou uma cadeia vazia, se não estivesse definida. A string vazia é então removida completamente, uma vez que não foi citada.
  • substituição de comando: nada aplicável
  • expansão aritmética: nada aplicável
  • divisão de palavras: o único candidato para isso seria o resultado da expansão da variável $abc , mas não há nada para dividir em uma sequência nula.
  • expansão do nome do caminho: nada aplicável

Quando as expansões forem concluídas, a variável abc no ambiente do utilitário a ser iniciado será configurada para o valor "hello" e o comando echo será executado. Ela produz apenas uma linha em branco.

¹ estritamente falando, ls também é passado como argumento, como seu argv[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 implementações de ls no entanto exibirão uma mensagem de erro como se o arquivo não existisse

    
por 13.08.2018 / 18:02

Tags