Como imprimir "-n" sem emitir uma nova linha?


16

Estou tentando imprimir -nusando o echocomando Mas se eu simplesmente digitar echo -n, ele somente emitirá uma nova linha, não aparecerá -n, em vez disso, emitirá uma nova linha.


Funciona echo -n -- -n(não tem nenhuma caixa linux à mão para testar)?
— N 23rd

Estou instalando o Ubuntu em uma máquina virtual e parece muito lento, espere.
— Star OS

11
Eu verifiquei - isso não acontece. Provavelmente porque é o comando bash interno e não está usando getopt(???) para analisar a linha de comando
— n0rd 23/11/2015

11
Esta pergunta é feita e respondida em pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Aplicativos em conformidade que ... possivelmente esperavam ecoar -n, devem usar o utilitário printf derivado do nono Sistema de edição "
— Brandin

Primeira pergunta popular que fiz. Yay?
— Star OS

Respostas:


28

O problema é que echointerpreta o -ncomo um argumento. Na implementação padrão do bash, isso significa (de help echo):

  -n  do not append a newline

Existem várias maneiras de contornar isso:

  1. Transforme-o em algo que não é uma opção, incluindo outro personagem. Por exemplo, diga echopara não imprimir uma nova linha com -n, em seguida, peça para interpretar escapes de barra invertida -ee adicione a nova linha explicitamente.

    $ echo -ne '-n\n'
    -n
  2. Como alternativa, basta incluir um espaço

    $ echo " -n"
     -n

    Isso, no entanto, adiciona um espaço que você provavelmente não quer.

  3. Use um caractere não imprimível antes dele. Aqui. Estou usando o backspace ( \b)

    $ echo -e "\b-n"
    -n

    Isso também adiciona um caractere extra que você provavelmente não deseja.

  4. Use truques

    $ echo n- | rev
    -n

    O revcomando simplesmente imprime sua saída invertida.

  5. Use a ferramenta certa para o trabalho

    $ printf -- '-n\n'
    -n

Você está certo que qualquer caractere `\` válido fará.
— Pilot6

@ Pilot6 sim, mas o problema com essa abordagem (a sua e a minha) é que ela adiciona um caractere extra. Isso pode causar problemas na linha. Especialmente se você quiser analisá-lo e tentar algo parecido grep '^-n'. pritnfé o caminho a seguir, realmente.
— terdon

Bem, printfé melhor de qualquer maneira, mas a questão é apenas justa echo.
— Pilot6

2
Parece que echo -e "-n\c"faz a coisa exata.
— Pilot6

11
\cé suprimir mais saída
— Pilot6 23/11


7

Você pode usar este comando, mas ele adiciona um espaço extra.

echo -e  "\r-n"

Este é um tipo de truque.

-e ativa símbolos de comando de barra invertida.

\r é um retorno de carro.

Na verdade, qualquer \caractere válido funciona em qualquer lugar da string.

Você pode ver quais são válidos por help echo.

echo "-n"não funciona porque -né usado como parâmetro para echo.

PS A melhor solução IMHO é

echo -e "-n\c"

Não adiciona caracteres extras .

echo -e "-n\n"

imprime da mesma forma, mas com um novo caractere de linha.


11
Wov! Isto é melhor que o meu; você pode explicar um pouco para "novatos" ;-)
— Sadi

Obrigado, também notei que não importa onde você adiciona o retorno de carro, no início ou no final.
— Sadi

@ Sadi sim, é porque adicionar qualquer coisa faz com que seja uma opção inválida. -né válido, -nfoonão é para que seja impresso.
— terdon

@terdon man echotambém. Mas helpé um pouco melhor.
— Pilot6

Eu sei que tem, não é relevante. /bin/echoé uma coisa completamente diferente e, quando você executa o echobash, obtém o built-in que pode ser bem diferente dependendo do seu shell.
— Ter23

5

Eu acho que se você definitivamente quiser usar echoapenas isso deve satisfazê-lo:

echo "-n "

Isso funciona porque while -né uma opção válida para echo, -ncom um espaço depois que não é. Como não é uma opção, echoapenas imprima.


A maioria dos espectadores aqui pode querer apenas "-n", não "-n".
— Star OS

5

Vocês estão realmente pensando demais.

 echo -e \\055n

Ou sem nova linha à direita

 echo -en \\055n

Como é printf "-n\n" pensar demais?
— Dmitry Grigoryev

Sim, acabei de responder dessa maneira. Excluirá minha resposta. Isso é relativamente portátil em que ele funciona com built-in de eco e /bin/echopelo menos se invocado comoecho -e "\055n"
— abligh

-en não é o que eu quero.
— Star OS

2

Para estender a resposta da @ AB, a única maneira portátil de usar echoé abster-se de usar opções como -n. Considere o uso, printfse disponível. Esta página de referência fornece mais detalhes e explica muito bem quando e como echoe printfdeve ser usado:

Atualmente, o echo (1) só é portátil se você omitir sinalizadores e escapar sequências. Use printf (1) em vez disso, se precisar de mais do que texto simples.


Se você vai estender uma resposta, edite-a.
— Star OS

Não sei se é uma boa ideia alterar a resposta de outra pessoa a ponto de ter mais texto meu do que do autor original.
— Dmitry Grigoryev

2

No script Bash, você pode executar:

echo -n -
echo n

Ou no shell interativo:

echo -n - ; echo n

Isso echoé um -personagem e um npersonagem.


Você tentou? Está errado.
— Pilot6


Primeiro comando de saída -pilot6@Pilot6:~$. As segundas saídas n.
— Pilot6

@ Pilot6 Depende se você está executando no terminal interativo ou em um script bash, que não está especificado na pergunta. OTOH, se você precisar no terminal, é simples combinar as duas linhas com &&- eu não diria que esta resposta está errada .
— user12205

Vou editá-lo para que fique muito mais claro que é para um script bash.
— Star OS

1

Três outras maneiras:

$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n

0

Você pode correr

printf -n;echo

Testado em Busybox Ash


Cinza? Cinza? POKEMON Quero dizer, o que?
— Star OS

Eu executei 'busybox ash'
— jiwopene

Diga "Busybox" ou "Busybox Ash". Não apenas "Ash", porque as pessoas podem pensar nesse personagem pokemon ou nas cinzas de vulcões.
— Star OS

Melhor. alt255alt255
— Star OS

@StarOS ashé o nome do Almquist Shell.
— muru
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.