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.