Wie kann ich "-n" ohne Zeilenumbruch ausgeben?


16

Ich versuche -nmit dem echoBefehl zu drucken . Aber wenn ich einfach echo -ntippe, wird nur eine neue Zeile ausgegeben, nicht angezeigt -n, stattdessen wird eine neue Zeile ausgegeben.


Funktioniert es echo -n -- -n(es ist keine Linux-Box zum Testen verfügbar)?
23.

Ich installiere Ubuntu in einer virtuellen Maschine und es scheint sehr langsam zu sein, warte.
Star OS

1
Ich habe nachgesehen - tut es nicht. Wahrscheinlich, weil es sich um einen internen Bash-Befehl handelt und nicht getopt(???) zum Parsen der Befehlszeile verwendet wird
Nr. 23.11.15

1
Diese Frage wird in pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html gestellt und beantwortet. - - " Wenn Sie Anwendungen konfigurieren , bei denen ... möglicherweise ein Echo von -n erwartet wird, sollten Sie das vom neunten Dienstprogramm abgeleitete Dienstprogramm printf verwenden Ausgabesystem "
Brandin

Erste populäre Frage, die ich gemacht habe. Yay?
Star OS

Antworten:


28

Das Problem ist, dass echodas -nals Argument interpretiert wird . In der Standard-Bash-Implementierung bedeutet dies (von help echo):

  -n  do not append a newline

Es gibt verschiedene Möglichkeiten, das zu umgehen:

  1. Machen Sie es zu etwas, das keine Option ist, indem Sie einen anderen Charakter einfügen. Sagen Sie beispielsweise, dass echoeine neue Zeile nicht gedruckt werden soll, und weisen -nSie sie dann an, Backslash-Escapes mit zu interpretieren -eund die neue Zeile explizit hinzuzufügen.

    $ echo -ne '-n\n'
    -n
  2. Alternativ können Sie auch ein Leerzeichen einfügen

    $ echo " -n"
     -n

    Das fügt jedoch einen Raum hinzu, den Sie wahrscheinlich nicht wollen.

  3. Verwenden Sie ein nicht druckbares Zeichen davor. Hier. Ich benutze die Rücktaste ( \b)

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

    Dies fügt auch ein zusätzliches Zeichen hinzu, das Sie wahrscheinlich nicht möchten.

  4. Verwenden Sie Tricks

    $ echo n- | rev
    -n

    Der revBefehl druckt die Ausgabe einfach umgekehrt.

  5. Verwenden Sie das richtige Werkzeug für den Job

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

Sie haben Recht, dass jedes gültige Zeichen ausreicht.
Pilot6

@Pilot6 ja, aber das Problem bei diesem Ansatz (deiner und meiner) ist, dass er einen zusätzlichen Charakter hinzufügt. Das kann Probleme auf der ganzen Linie verursachen. Vor allem, wenn Sie es dann analysieren und versuchen möchten, etwas wie grep '^-n'. pritnfist der richtige Weg.
Terdon

Naja, printfist sowieso besser, aber die Frage betrifft eben echo.
Pilot6

2
Es sieht so aus, als ob echo -e "-n\c"es genau das Richtige wäre.
Pilot6

1
\cWeitere Ausgabe unterdrücken
Pilot6


7

Sie können diesen Befehl verwenden, er fügt jedoch zusätzlichen Speicherplatz hinzu.

echo -e  "\r-n"

Dies ist eine Art Hack.

-e Aktiviert Backslash-Befehlssymbole.

\r ist ein Wagenrücklauf.

Tatsächlich kann jedes \gültige Zeichen an einer beliebigen Stelle der Zeichenfolge verwendet werden.

Sie können sehen, welche gültig sind durch help echo.

echo "-n"funktioniert nicht, weil -nes als Parameter für verwendet wird echo.

PS Die beste Lösung ist meiner Meinung nach

echo -e "-n\c"

Es werden keine zusätzlichen Zeichen hinzugefügt .

echo -e "-n\n"

druckt das selbe aber mit einem neuen Zeilenzeichen.


1
Wov! Das ist besser als meins; kannst du etwas für "Anfänger" erklären ;-)
Sadi

Danke, mir ist auch aufgefallen, dass es egal ist, wo Sie den Wagenrücklauf am Anfang oder am Ende einfügen.
Sadi

@Sadi Ja, das liegt daran, dass das Hinzufügen einer Option zu einer ungültigen Option führt. -nist gültig, -nfoowird also nicht gedruckt.
Terdon

@terdon man echohat es auch. Ist helpaber ein bisschen besser.
Pilot6

Ich weiß, es hat es, es ist einfach nicht relevant. /bin/echoist eine völlig andere Sache und wenn Sie echoin Bash laufen , erhalten Sie die eingebaute, die je nach Ihrer Shell sehr unterschiedlich sein kann.
Terdon

5

Ich denke, wenn Sie auf jeden Fall echonur verwenden möchten , sollte dies Sie zufriedenstellen:

echo "-n "

Dies funktioniert, weil while -neine gültige Option für echoist -nund ein Leerzeichen danach nicht. Da dies keine Option ist, echodrucken Sie es einfach aus.


Die meisten Betrachter hier möchten möglicherweise nur "-n", nicht "-n".
Star OS

5

Ihr überdenkt es wirklich.

 echo -e \\055n

Oder ohne nachgestellte Newline

 echo -en \\055n

Wie ist printf "-n\n" ein Überdenken?
Dmitry Grigoryev

Ja, ich habe nur so geantwortet. Löscht meine Antwort. Dies ist relativ tragbar, dass es funktioniert mit integrierte Echo und /bin/echozumindest , wenn aufgerufen , wieecho -e "\055n"
abligh

-en ist nicht was ich will.
Star OS

2

Um die Antwort von @ AB zu erweitern, besteht die einzige tragbare Möglichkeit darin echo, keine Optionen wie diese zu verwenden -n. Verwenden Sie printfstattdessen, sofern verfügbar. Diese Referenzseite bietet weitere Details und erklärt sehr gut, wann und wie echound printfsollte verwendet werden:

Heutzutage ist echo (1) nur noch portabel, wenn Sie Flags und Escape-Sequenzen weglassen. Verwenden Sie stattdessen printf (1), wenn Sie mehr als nur Text benötigen.


Ich habe vor, eine Antwort zu verlängern. Bitte bearbeite die Antwort.
Star OS

Ich bin mir nicht sicher, ob es eine gute Idee ist, die Antwort eines anderen so zu ändern, dass mehr Text von mir als vom ursprünglichen Autor kommt.
Dmitry Grigoryev

2

Im Bash-Skript können Sie Folgendes ausführen:

echo -n -
echo n

Oder in interaktiver Shell:

echo -n - ; echo n

Das ist echoein -Charakter und ein nCharakter.


Hast Du es versucht? Es ist falsch.
Pilot6


Erste Befehlsausgaben -pilot6@Pilot6:~$. Die zweiten Ausgänge n.
Pilot6

@ Pilot6 Hängt davon ab, ob Sie es in einem interaktiven Terminal oder in einem Bash-Skript ausführen, das in der Frage nicht angegeben ist. OTOH, wenn Sie es im Terminal brauchen, ist es einfach, die beiden Zeilen mit zu kombinieren &&- ich würde nicht wirklich sagen, dass diese Antwort falsch ist .
user12205

Ich bearbeite es, damit es für ein Bash-Skript viel klarer wird.
Star OS

1

Drei weitere Möglichkeiten:

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

0

Du kannst rennen

printf -n;echo

Getestet in Busybox Ash


Asche? Asche? POKEMON Ich meine, was?
Star OS

Ich lief 'busybox ash'
Jiwopene

Sagen Sie "Busybox" oder "Busybox Ash". Nicht nur "Ash", sondern auch die Asche von Vulkanen.
Star OS

Besser. alt255alt255
Star OS

@StarOS ashist der Name der Almquist Shell.
muru
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.