Does the shell pass variables declared in its environment to other system programs that it invokes?
Sim, mas não no caso de cat <<< "$str"
.
Em sistemas operacionais do tipo Unix, a maioria dos novos programas é executada como resultado do sistema execve()
all:
int execve(const char *filename, char *const argv[], char *const envp[]);
O shell usa execv
para executar programas e, por padrão, o shell transmite todas as variáveis de ambiente em envp
, semelhante à maneira como os argumentos de linha de comando são transmitidos em argv
. Conceitualmente, envp
é uma sequência de strings, cada uma com o formato NAME=value
.
man 2 execve
explica todo o processo com muita clareza e inclui código de exemplo de trabalho.
No caso de cat <<<"$str"
, o shell fornece "$ str" à entrada padrão de cat
on cat
, portanto cat
nunca vê a variável denominada str
, a menos que tenha sido exportada anteriormente por o shell, por exemplo invocando export str
, mas cat
não tem como saber que os dois estão relacionados.
<<<
é um "Here String" e uma extensão do shell. Na página bash
man:
The word undergoes brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, and quote removal. Pathname expansion and word splitting are not performed. The result is supplied as a single string to the command on its standard input.
O Here String é semelhante ao idioma tradicional:
echo "$str" | cat
que eu recomendo. Ambos, de fato, adicionarão uma nova linha no final da entrada padrão. Eu acredito que ambos os métodos são idênticos, desde que echo
não modifique a saída de qualquer forma (o que pode depender do conteúdo da string, então uma versão mais segura é printf '%s' "$str"
em vez de echo
).
Na sua situação, eu usaria printf '%s' "$str" | cat
porque é o mais portátil, universal e de fácil compreensão, sem bloquear o seu script para execução com apenas um dos muitos shells. Se você usar a página POSIX sh
man para sua documentação do shell script, você terá menos material para masterizar, e o material que você aprende tem aplicação em todos os derivados de shell Bourne.