Come stampare "-n" senza emettere una nuova riga?


16

Sto provando a stampare -nusando il echocomando. Ma se scrivo semplicemente echo -n, emette solo una nuova riga, non si presenta -n, ma emette una nuova riga.


Funziona echo -n -- -n(non hai alcuna Linux box a portata di test)?
— n.

Sto installando Ubuntu in una macchina virtuale e sembra essere molto lento, aspetta.
— Star OS,

1
Ho controllato - non lo fa. Probabilmente perché è un comando bash interno e non utilizza getopt(???) per analizzare la riga di comando
— n0rd

1
Questa domanda viene posta e risposta in pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Le applicazioni conformi che ... potrebbero aspettarsi di echeggiare a -n, dovrebbero usare l'utilità printf derivata dalla nona Sistema di edizione "
— Brandin,

Prima domanda popolare che ho fatto. Sìì?
— Star OS

Risposte:


28

Il problema è che echointerpreta il -ncome argomento. Nell'implementazione predefinita di bash, ciò significa (da help echo):

  -n  do not append a newline

Esistono vari modi per aggirare questo:

  1. Trasformalo in qualcosa che non è un'opzione includendo un altro personaggio. Ad esempio, dire di echonon stampare una nuova riga con -n, quindi di interpretare le barre rovesciate con -ee aggiungere esplicitamente la nuova riga.

    $ echo -ne '-n\n'
    -n
  2. In alternativa, includi solo uno spazio

    $ echo " -n"
     -n

    Ciò, tuttavia, aggiunge uno spazio che probabilmente non vuoi.

  3. Utilizzare un carattere non stampabile prima di esso. Qui. Sto usando il backspace ( \b)

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

    Questo aggiunge anche un personaggio extra che probabilmente non vuoi.

  4. Usa l'inganno

    $ echo n- | rev
    -n

    Il revcomando stampa semplicemente il suo output invertito.

  5. Usa lo strumento giusto per il lavoro

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

Hai ragione che qualsiasi carattere `\` valido farà.
— Pilota 6

@ Pilot6 sì, ma il problema con questo approccio (il tuo e il mio) è che aggiunge un carattere in più. Ciò può causare problemi in futuro. Soprattutto se poi vuoi analizzarlo e provare qualcosa del genere grep '^-n'. pritnfè la strada da percorrere, davvero.
— terdon,

Bene, printfè meglio comunque, ma la domanda riguarda solo echo.
— Pilota 6

2
Sembra che echo -e "-n\c"faccia esattamente la cosa.
— Pilota 6

1
\cè soppresso ulteriore output
— Pilot6


7

È possibile utilizzare questo comando, ma aggiunge uno spazio aggiuntivo.

echo -e  "\r-n"

Questa è una specie di hack.

-e abilita i simboli del comando barra rovesciata.

\r è un ritorno a capo.

In realtà qualsiasi \ carattere valido farà in qualsiasi luogo della stringa.

Puoi vedere quali sono validi per help echo .

echo "-n"non funziona perché -nviene utilizzato come parametro perecho .

PS La soluzione migliore è IMHO

echo -e "-n\c"

Non aggiunge altri caratteri .

echo -e "-n\n"

stampa lo stesso ma con un nuovo carattere di linea.


1
WOV! Questo è meglio del mio; puoi spiegarci un po 'per "principianti" ;-)
— Sadi,

Grazie, ho anche notato che non importa dove aggiungi il ritorno a capo, all'inizio o alla fine.
— Sadi,

@Sadi sì, perché aggiungere qualcosa lo rende un'opzione non valida. -nè valido, -nfoonon è così che verrà stampato.
— terdon,

Anche @terdon ce l' man echoha. Ma helpè un po 'meglio.
— Pilota 6

So che ce l'ha, non è rilevante. /bin/echoè una cosa completamente diversa e quando corri echoin bash, ottieni l'integrato che può essere molto diverso a seconda della tua shell.
— terdon,

5

Penso che se vuoi assolutamente usare echosolo, questo dovrebbe soddisfarti:

echo "-n "

Questo funziona perché while -nè un'opzione valida per echo, -ncon uno spazio dopo non lo è. Dal momento che non è un'opzione, la echostampa e basta.


La maggior parte degli spettatori qui potrebbe voler solo "-n", non "-n".
— Star OS

5

Ragazzi, state davvero pensando troppo.

 echo -e \\055n

O senza newline finali

 echo -en \\055n

Come sta printf "-n\n" un ripensamento?
— Dmitry Grigoryev,

Sì, ho appena risposto in questo modo. Cancella la mia risposta. Questo è relativamente portatile in quanto funziona con l'eco integrata e /bin/echoalmeno se invocato comeecho -e "\055n"
— circa il

-en non è quello che voglio.
— Star OS

2

Per estendere la risposta di @ AB, l'unico modo portatile da utilizzare echoè di astenersi dall'utilizzare qualsiasi opzione simile -n. Considera printfinvece l' uso ove disponibile. Questa pagina di riferimento fornisce maggiori dettagli e spiega molto bene quando e come echoe come printfdovrebbero essere usati:

Al giorno d'oggi, echo (1) è portatile solo se si omettono flag e si evitano le sequenze. Usa invece printf (1), se hai bisogno di qualcosa di più del semplice testo.


Ho intenzione di estendere una risposta, per favore modifica la risposta.
— Star OS

Non sono sicuro che sia una buona idea modificare la risposta di qualcun altro al punto in cui avrà più testo da me che dall'autore originale.
— Dmitry Grigoryev l'

2

Nello script Bash puoi eseguire:

echo -n -
echo n

O in guscio interattivo:

echo -n - ; echo n

Questo è echoun -personaggio e un npersonaggio.


Hai provato? È sbagliato.
— Pilota 6


Output del primo comando -pilot6@Pilot6:~$. Le seconde uscite n.
— Pilota 6

@ Pilot6 Dipende se lo stai eseguendo in un terminale interattivo o in uno script bash, che non è specificato nella domanda. OTOH se ne hai bisogno nel terminale è semplice combinare le due linee con &&- Non direi davvero che questa risposta è sbagliata .
— user12205,

Lo modificherò in modo che diventi molto più chiaro per uno script bash.
— Star OS

1

Tre altri modi:

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

0

Puoi correre

printf -n;echo

Testato in Busybox Ash


Cenere? Cenere? POKEMON Voglio dire, cosa?
— Star OS

Ho corso "busybox ash"
— jiwopene l'

Pronuncia "Busybox" o "Busybox Ash". Non solo "Ash" perché la gente può pensare a quel personaggio pokemon o alla cenere ******* dei vulcani.
— Star OS

Meglio. alt255alt255
— Star OS

@StarOS ashè il nome di Almquist Shell.
— Muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.