Por que um bash here-string adiciona um caractere de nova linha à direita?

29

Os exemplos a seguir mostram que uma nova linha é adicionada a uma string aqui .
Por que isso é feito?

xxd -p <<<'a'  
# output: 610a

xxd -p <<<'a
'
# output: 610a0a
    
por Peter.O 06.09.2011 / 01:12

3 respostas

33

A resposta fácil é porque o ksh é escrito dessa maneira (e o bash é compatível). Mas há uma razão para essa escolha de design.

A maioria dos comandos espera entrada de texto. No mundo unix, um arquivo de texto consiste em uma seqüência de linhas, cada uma terminando em uma nova linha . Portanto, na maioria dos casos, é necessária uma nova linha final. Um caso especialmente comum é capturar a saída de um comando com um comando susbtitution, processá-lo de alguma forma e depois passá-lo para outro comando. A substituição do comando retira as novas linhas finais; <<< coloca um de volta.

tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp

O Bash e o ksh não podem manipular dados binários de qualquer maneira (ele não pode lidar com caracteres nulos), portanto, não é surpreendente que suas instalações sejam voltadas para dados de texto.

A sintaxe <<< here-string é principalmente apenas por conveniência, como << here-documents. Se você não precisar adicionar uma nova linha final, use echo -n (no bash) ou printf e um pipeline.

    
por 06.09.2011 / 01:59
3

Um cenário no qual é prático incluir novas linhas anexadas a strings aqui é ao usar o comando read quando o modo set -e está ativo. Lembre-se de que set -e faz com que um script seja encerrado quando ele (mais ou menos) encontrar instruções que geram um código de status diferente de zero. Considere que read gera um código de status diferente de zero quando encontra uma string sem novas linhas:

#!/bin/bash
set -e

# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'

# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'
    
por 06.11.2015 / 18:18
-3

Acho que essa é a única maneira de obter uma nova linha no final de uma string aqui, prova:

xxd <<<'echo -ne "a\n"'

Parece que o operador here-strips cria novas linhas, a menos que elas sejam fornecidas na sintaxe que você enviou.

    
por 06.09.2011 / 01:38