Ich versuche -n
mit dem echo
Befehl zu drucken . Aber wenn ich einfach echo -n
tippe, wird nur eine neue Zeile ausgegeben, nicht angezeigt -n
, stattdessen wird eine neue Zeile ausgegeben.
getopt
(???) zum Parsen der Befehlszeile verwendet wird
Ich versuche -n
mit dem echo
Befehl zu drucken . Aber wenn ich einfach echo -n
tippe, wird nur eine neue Zeile ausgegeben, nicht angezeigt -n
, stattdessen wird eine neue Zeile ausgegeben.
getopt
(???) zum Parsen der Befehlszeile verwendet wird
Antworten:
Das Problem ist, dass echo
das -n
als 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:
Machen Sie es zu etwas, das keine Option ist, indem Sie einen anderen Charakter einfügen. Sagen Sie beispielsweise, dass echo
eine neue Zeile nicht gedruckt werden soll, und weisen -n
Sie sie dann an, Backslash-Escapes mit zu interpretieren -e
und die neue Zeile explizit hinzuzufügen.
$ echo -ne '-n\n'
-n
Alternativ können Sie auch ein Leerzeichen einfügen
$ echo " -n"
-n
Das fügt jedoch einen Raum hinzu, den Sie wahrscheinlich nicht wollen.
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.
Verwenden Sie Tricks
$ echo n- | rev
-n
Der rev
Befehl druckt die Ausgabe einfach umgekehrt.
Verwenden Sie das richtige Werkzeug für den Job
$ printf -- '-n\n'
-n
grep '^-n'
. pritnf
ist der richtige Weg.
printf
ist sowieso besser, aber die Frage betrifft eben echo
.
echo -e "-n\c"
es genau das Richtige wäre.
\c
Weitere Ausgabe unterdrücken
Manchmal ist es eine gute Idee, das richtige Werkzeug zu verwenden. Sie könnten printf
stattdessen verwenden:
% printf "-n\n"
-n
echo
, die printf
aber besser standardisiert sind .
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 -n
es 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.
-n
ist gültig, -nfoo
wird also nicht gedruckt.
man echo
hat es auch. Ist help
aber ein bisschen besser.
/bin/echo
ist eine völlig andere Sache und wenn Sie echo
in Bash laufen , erhalten Sie die eingebaute, die je nach Ihrer Shell sehr unterschiedlich sein kann.
Ich denke, wenn Sie auf jeden Fall echo
nur verwenden möchten , sollte dies Sie zufriedenstellen:
echo "-n "
Dies funktioniert, weil while -n
eine gültige Option für echo
ist -n
und ein Leerzeichen danach nicht. Da dies keine Option ist, echo
drucken Sie es einfach aus.
Ihr überdenkt es wirklich.
echo -e \\055n
Oder ohne nachgestellte Newline
echo -en \\055n
printf "-n\n"
ein Überdenken?
/bin/echo
zumindest , wenn aufgerufen , wieecho -e "\055n"
Um die Antwort von @ AB zu erweitern, besteht die einzige tragbare Möglichkeit darin echo
, keine Optionen wie diese zu verwenden -n
. Verwenden Sie printf
stattdessen, sofern verfügbar. Diese Referenzseite bietet weitere Details und erklärt sehr gut, wann und wie echo
und printf
sollte 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.
Im Bash-Skript können Sie Folgendes ausführen:
echo -n -
echo n
Oder in interaktiver Shell:
echo -n - ; echo n
Das ist echo
ein -
Charakter und ein n
Charakter.
-pilot6@Pilot6:~$
. Die zweiten Ausgänge n
.
&&
- ich würde nicht wirklich sagen, dass diese Antwort falsch ist .
Du kannst rennen
printf -n;echo
Getestet in Busybox Ash
ash
ist der Name der Almquist Shell.
echo -n -- -n
(es ist keine Linux-Box zum Testen verfügbar)?