Eu não sabia sobre printf, com printf funciona: P ... então o que faz com que não funcione com eco então?
Saeid Yazdani
É \rincluir na saída ou faz parte da CRLFnova linha?
cuonglm
9
Existem muitas implementações de echocomando diferentes incompatíveis entre si. Portanto, é recomendável usar uma ferramenta mais padrão como printf. Consulte unix.stackexchange.com/questions/65803/… para obter uma visão geral mais detalhada do problema.
Uma sequência a ser gravada na saída padrão. Se o primeiro operando for -n, ou se algum dos operandos contiver um caractere < \barra invertida> , os resultados serão definidos pela implementação .
Nos sistemas em conformidade com XSI , se o primeiro operando for -n, ele deve ser tratado como uma sequência, não como uma opção . As seguintes seqüências de caracteres devem ser reconhecidas em sistemas compatíveis com XSI em qualquer um dos argumentos:
\a- Escreva um <alerta> .
\b- Escreva um <backspace> .
\c- Suprima o <newline> que segue o argumento final na saída. Todos os caracteres que seguem \cos argumentos devem ser ignorados.
\f- Escreva um <formfeed> .
\n- Escreva um <newline> .
\r- Escreva um <retorno de carro> .
\t- Escreva uma <tab> .
\v- Escreva uma <vertical-tab> .
\\- Escreva um caractere <barra invertida> .
\0num- Escreva um valor de 8 bits que seja o número octal de zero, um, dois ou três dígitos num.
E, portanto, realmente não existe uma maneira geral de saber como escrever uma nova linha echo, exceto que geralmente você pode confiar apenas echoem fazê-lo.
Um bashshell normalmente não está em conformidade com a especificação e lida com as -noutras opções, mas mesmo isso é incerto. Você pode fazer:
shopt -s xpg_echo
echo hey\\nthere
hey
there
E nem isso é necessário se bashtiver sido construído com a opção de tempo de compilação ...
Faça o echobuilt-in expandir caracteres de escape com barra invertida por padrão, sem exigir a -eopção. Isso define o valor padrão da xpg_echoopção shell para on, o que faz com que o Bash echose comporte mais como a versão especificada na Especificação Unix Única, versão 3. Consulte Bash Builtins , para obter uma descrição das seqüências de escape que echoreconhecem.
printf
Por outro lado, printfo comportamento é bastante manso em comparação.
O printfutilitário foi adicionado para fornecer funcionalidades historicamente fornecidas por echo. No entanto, devido a diferenças irreconciliáveis nas várias versões echoexistentes, a versão possui poucos recursos especiais, deixando-os para este novo printfutilitário, baseado em um sistema da Nona Edição.
A seção DESCRIÇÃO ESTENDIDA corresponde quase exatamente à printf()função no padrão ISO C, embora seja descrita em termos da notação de formato de arquivo na Notação de formato de arquivo XBD .
Ele lida com strings de formato que descrevem seus argumentos - que podem ser inúmeras coisas, mas para strings são basicamente %bstrings yte ou strings literais %s. Além dos %formats no primeiro argumento, ele se comporta mais como um %bargumento de string yte, exceto pelo fato de não lidar com a \cfuga.
Uma opção "-e" simples e agradável para que as seqüências de escape funcionem - diz outra resposta que echonão é confiável e não segue padrões diferentes printf.
Edward
1
Verifique se o seu roteiro não contém qualquer literal \ r \ n, como em um tr -d "\n"comando.
Novmen
8
Em todas as versões do bash que usei, você pode simplesmente inserir uma nova linha literal em uma sequência de forma interativa ou em um script, desde que a sequência seja suficientemente citada.
echo
obrigatório? você pode usarprintf
.\r
incluir na saída ou faz parte daCRLF
nova linha?echo
comando diferentes incompatíveis entre si. Portanto, é recomendável usar uma ferramenta mais padrão comoprintf
. Consulte unix.stackexchange.com/questions/65803/… para obter uma visão geral mais detalhada do problema.Respostas:
echo
Uma
echo
implementação que esteja em conformidade estrita com a Especificação Unix Única adicionará novas linhas se você:Mas esse não é um comportamento confiável. Na verdade, não há realmente não é qualquer comportamento padrão que você pode esperar de
echo
.E, portanto, realmente não existe uma maneira geral de saber como escrever uma nova linha
echo
, exceto que geralmente você pode confiar apenasecho
em fazê-lo.Um
bash
shell normalmente não está em conformidade com a especificação e lida com as-n
outras opções, mas mesmo isso é incerto. Você pode fazer:E nem isso é necessário se
bash
tiver sido construído com a opção de tempo de compilação ...printf
Por outro lado,
printf
o comportamento é bastante manso em comparação.Ele lida com strings de formato que descrevem seus argumentos - que podem ser inúmeras coisas, mas para strings são basicamente
%b
strings yte ou strings literais%s
. Além dos%f
ormats no primeiro argumento, ele se comporta mais como um%b
argumento de string yte, exceto pelo fato de não lidar com a\c
fuga.Consulte Por que é
printf
melhor queecho
? para mais.echo() printf
Você pode escrever seus próprios padrões conforme
echo
...... o que deve sempre fazer a coisa certa automaticamente.
Na verdade, não ... Isso imprime um literal
\n
no final dos argumentos se o último argumento terminar em um número ímpar de <barras invertidas> .Mas isso não acontece:
fonte
shopt -s xpg_echo
opçãoecho
usada-e
por padrão.-e
. Estou surpreso que ninguém percebeu isso, exceto talvez @HaydeSchiffPasse o sinalizador -e para ecoar para analisar caracteres escapados, como "\ r \ n", da seguinte maneira:
fonte
echo
não é confiável e não segue padrões diferentesprintf
.tr -d "\n"
comando.Em todas as versões do bash que usei, você pode simplesmente inserir uma nova linha literal em uma sequência de forma interativa ou em um script, desde que a sequência seja suficientemente citada.
Interativamente:
Em um script:
fonte
outras possibilidades de uso:
fonte
As pessoas já responderam adequadamente, mas eu me recuso a aceitar um mundo onde o eco aceita qualquer outra opção que não seja
-n
.fonte
Se você tem um personagem que não faz parte da mensagem, pode passar por sed
fonte