¿Cómo imprimir "-n" sin emitir una nueva línea?

16

Estoy tratando de imprimir -nusando el echocomando. Pero si simplemente escribo echo -n, solo emite una nueva línea, no aparece -n, sino que emite una nueva línea.

OS estrella
fuente
¿ echo -n -- -nFunciona (no tengo ninguna caja de Linux a mano para probar)?
2015
Estoy instalando Ubuntu en una máquina virtual y parece ser muy lento, espera.
Star OS
1
Lo he comprobado, no lo hace. Probablemente porque es un comando bash interno y no está usando getopt(???) para analizar la línea de comando
n0rd
1
Esta pregunta se hace y se responde en pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Las aplicaciones conformes que ... podrían esperar hacer eco a -n, deberían usar la utilidad printf derivada del Noveno Sistema de edición "
Brandin
Primera pregunta popular que he hecho. ¿Hurra?
Star OS

Respuestas:

28

El problema es que echointerpreta el -ncomo un argumento. En la implementación de bash predeterminada, eso significa (desde help echo):

  -n  do not append a newline

Hay varias formas de evitarlo:

  1. Conviértalo en algo que no sea una opción al incluir otro personaje. Por ejemplo, diga que echono imprima una nueva línea con -n, luego dígale que interprete los escapes de barra invertida con -ey agregue la nueva línea explícitamente.

    $ echo -ne '-n\n'
    -n
  2. Alternativamente, solo incluya un espacio

    $ echo " -n"
     -n

    Eso, sin embargo, agrega un espacio que probablemente no quieras.

  3. Use un carácter que no sea de impresión antes. Aquí. Estoy usando la tecla de retroceso ( \b)

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

    Esto también agrega un personaje extra que probablemente no quieras.

  4. Usa trucos

    $ echo n- | rev
    -n

    El revcomando simplemente imprime su salida invertida.

  5. Use la herramienta adecuada para el trabajo

    $ printf -- '-n\n'
    -n
terdon
fuente
Tienes razón en que cualquier carácter válido `\` lo hará.
Pilot6
@ Pilot6 sí, pero el problema con ese enfoque (el tuyo y el mío) es que agrega un carácter adicional. Eso puede causar problemas en el futuro. Especialmente si quieres analizarlo e intentar algo como grep '^-n'. pritnfes el camino a seguir, de verdad.
terdon
Bueno, de printftodos modos es mejor, pero la pregunta es sobre solo echo.
Pilot6
2
Parece que echo -e "-n\c"hace exactamente lo mismo.
Pilot6
1
\ces suprimir más salida
Pilot6
7

Puede usar este comando, pero agrega un espacio extra.

echo -e  "\r-n"

Este es un tipo de truco.

-e habilita los símbolos de comando de barra invertida.

\r Es un retorno de carro.

En realidad, cualquier \carácter válido funcionará en cualquier lugar de la cadena.

Puedes ver cuáles son válidos por help echo.

echo "-n"no funciona porque -nse usa como parámetro para echo.

PD La mejor solución en mi humilde opinión es

echo -e "-n\c"

No agrega caracteres adicionales .

echo -e "-n\n"

imprime lo mismo pero con una nueva línea de caracteres.

Piloto6
fuente
1
Wov! Esto es mejor que el mío; ¿Puedes explicar un poco para los "principiantes" ;-)
Sadi
Gracias, también noté que no importa dónde agregue el retorno de carro, al principio o al final.
Sadi
@Sadi sí, eso es porque agregar algo lo convierte en una opción no válida. -nes válido, -nfoono es así que se imprimirá.
terdon
@terdon man echotambién lo tiene. Pero helpes un poco mejor.
Pilot6
Sé que lo tiene, simplemente no es relevante. /bin/echoes una cosa completamente diferente y cuando ejecutas echoen bash, obtienes el incorporado que puede ser bastante diferente dependiendo de tu shell.
terdon
5

Creo que si definitivamente quieres usar echosolo, esto debería satisfacerte:

echo "-n "

Esto funciona porque while -nes una opción válida para echo, -ncon un espacio después de que no lo es. Como no es una opción, echosolo la imprime.

Sadi
fuente
La mayoría de los espectadores aquí solo quieren "-n", no "-n".
Star OS
5

Ustedes realmente lo están pensando demasiado.

 echo -e \\055n

O sin nueva línea final

 echo -en \\055n
Joshua
fuente
¿Cómo es printf "-n\n" un pensamiento excesivo?
Dmitry Grigoryev
Sí, acabo de responder de esta manera. Eliminaré mi respuesta. Esto es relativamente portátil ya que funciona con eco incorporado y /bin/echoal menos si se invoca comoecho -e "\055n"
hasta el
-en no es lo que quiero.
Star OS
2

Para extender la respuesta de @ AB, la única forma portátil de usar echoes abstenerse de usar opciones como -n. Considere usar printfen su lugar donde esté disponible. Esta página de referencia proporciona más detalles y explica muy bien cuándo, cómo echoy cómo printfdebe usarse:

Hoy en día, echo (1) solo es portátil si omite banderas y secuencias de escape. Utilice printf (1) en su lugar, si necesita algo más que texto sin formato.

Dmitry Grigoryev
fuente
Voy a extender una respuesta, edítela.
Star OS
No estoy seguro de que sea una buena idea alterar la respuesta de otra persona hasta el punto en que tenga más texto mío que del autor original.
Dmitry Grigoryev
2

En el script Bash puedes ejecutar:

echo -n -
echo n

O en shell interactivo:

echo -n - ; echo n

Este echoes un -personaje y un npersonaje.

jiwopene
fuente
¿Lo intentaste? Está mal.
Pilot6
@ Pilot6 ¿Lo
usuario12205
Primer comando salidas -pilot6@Pilot6:~$. Las segundas salidas n.
Pilot6
@ Pilot6 Depende de si lo está ejecutando en una terminal interactiva o en un script bash, que no se especifica en la pregunta. Otoh si lo necesita en el terminal es fácil de simplemente combinar las dos líneas con &&- Realmente no lo digo esta respuesta es incorrecta .
usuario12205
Lo editaré para que quede mucho más claro que es para un script bash.
Star OS
1

Otras tres formas:

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

Tu puedes correr

printf -n;echo

Probado en Busybox Ash

jiwopene
fuente
¿Ceniza? ¿Ceniza? POKEMON quiero decir, ¿qué?
Star OS
Ejecuté
Diga "Busybox" o "Busybox Ash". No solo "Ash" porque la gente puede pensar en ese personaje de Pokémon o en la ceniza de los volcanes.
Star OS
Mejor. alt255alt255
Star OS
@StarOS ashes el nombre de la Shell Almquist.
muru