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.