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.

Star OS
fonte
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
Terdon
fonte
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.

Pilot6
fonte
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.

Sadi
fonte
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
Joshua
fonte
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.

Dmitry Grigoryev
fonte
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.

jiwopene
fonte
Você tentou? Está errado.
Pilot6
@ Pilot6 Você tentou? É não errado.
user12205
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
kos
fonte
0

Você pode correr

printf -n;echo

Testado em Busybox Ash

jiwopene
fonte
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