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 denominadaabc
. 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 queabc
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