A resposta simples é que wc -l <<< "${string_variable}"
é um atalho do ksh / bash / zsh para printf "%s\n" "${string_variable}" | wc -l
.
Na verdade, existem diferenças na forma <<<
e em um trabalho de canal: <<<
cria um arquivo temporário que é passado como entrada para o comando, enquanto |
cria um canal. Em bash e pdksh / mksh (mas não em ksh93 ou zsh), o comando no lado direito do pipe é executado em um subshell. Mas essas diferenças não importam neste caso particular.
Observe que, em termos de contagem de linhas, isso pressupõe que a variável não está vazia e não termina com uma nova linha. Não terminar com uma nova linha é o caso quando a variável é o resultado de uma substituição de comando, então você obterá o resultado correto na maioria dos casos, mas você obterá 1 para a string vazia.
Existem duas diferenças entre var=$(somecommand); wc -l <<<"$var"
e somecommand | wc -l
: usando uma substituição de comando e uma variável temporária retira linhas em branco no final, esquece se a última linha de saída terminou em uma nova linha ou não (sempre acontece se o comando gera um arquivo de texto não vazio válido) e conta um por um se a saída estiver vazia. Se você quer preservar o resultado e contar linhas, você pode fazer isso adicionando algum texto conhecido e retirando-o no final:
output=$(somecommand; echo .)
line_count=$(($(printf "%s\n" "$output" | wc -l) - 1))
printf "The exact output is:\n%s" "${output%.}"