Vergleichen Sie
echo -n "bar"
mit
echo "bar" -n
Ersteres macht das, was es meiner Meinung nach tun soll (druckt "Balken" ohne Zeilenumbruch), letzteres nicht. Ist das ein Fehler oder beabsichtigt? Warum unterscheidet es sich von vielen CLI-Programmen darin, dass Sie die Optionen nicht verschieben können? Zum Beispiel tail -f /var/log/messages
ist genau das gleiche wie tail /var/log/messages -f
. Ich mache manchmal Letzteres, wenn ich vergesse, dass ich Ersteres wollte, weil intern die Optionen und Argumente neu angeordnet werden, normalerweise von getopt .
Update: Ja, ich habe meine Frage ursprünglich bearbeitet. Ich habe den Nerf entfernt, den Sie im Verlauf anzeigen müssen, damit einige der Antworten sinnvoll sind.
command-line
Xenoterracid
quelle
quelle
echo -n "bar"
gibt "bar", währendecho "bar" -n
gibt "bar -n"Antworten:
Wie die meisten anderen beobachtet haben, wird "-n" wörtlich interpretiert, wenn es irgendwo anders als unmittelbar nach dem
echo
Befehl platziert wird.In der Vergangenheit waren alle UNIX-Dienstprogramme so - sie suchten erst unmittelbar nach dem Befehlsnamen nach Optionen. Es war wahrscheinlich entweder BSD oder GNU, die Pionierarbeit für den flexibleren Stil geleistet haben (obwohl ich mich irren könnte), da POSIX bereits jetzt den alten Weg als korrekt spezifiziert (siehe Richtlinie 9 und auch
man 3 getopt
auf einem Linux-System). Obwohl die meisten Linux-Dienstprogramme heutzutage den neuen Stil verwenden, gibt es einige Holdouts wieecho
.Echo
In Bezug auf Standards ist dies insofern ein Chaos, als zum Zeitpunkt der Gründung von POSIX mindestens zwei grundlegend widersprüchliche Versionen im Spiel waren. Auf der einen Seite haben Sie den SYSV-Stil, der Backslash-Escape-Zeichen interpretiert, ansonsten aber seine Argumente wörtlich behandelt und keine Optionen akzeptiert. Auf der anderen Seite haben Sie einen BSD-Stil, der eine Initiale-n
als Sonderfall behandelt und absolut alles andere buchstäblich ausgibt. Und da diesecho
so praktisch ist, haben Sie Tausende von Shell-Skripten, die von dem einen oder anderen Verhalten abhängen:Aufgrund der Semantik "Alles wörtlich behandeln" ist es unmöglich, eine neue Option hinzuzufügen,
echo
ohne die Dinge zu beschädigen. Wenn GNU das flexible Optionsschema verwenden würde, würde die Hölle losbrechen.Verwenden Sie
printf
echo
für eine optimale Kompatibilität zwischen Bourne-Shell-Implementierungen übrigens eher als .AKTUALISIERT , um zu erklären, warum
echo
insbesondere keine flexiblen Optionen verwendet werden.quelle
POSIXLY_CORRECT
.echo
gibt es auch Implementierungen, die-e
oder-E
als Optionen erkennen. Beginnen Sie aus Gründen der Portabilität nicht mit einem-
oder verwenden Sie so etwas wieprintf %s -e
.Die anderen Antworten kommen zu dem Punkt, an dem Sie auf der Manpage nachsehen können, dass -n Teil der zu hallenden Zeichenfolge wird. Ich möchte jedoch nur darauf hinweisen, dass es einfach ist, dies ohne die md5sum zu untersuchen, und das, was vor sich geht, etwas weniger kryptisch macht.
quelle
Wow, alle Erklärungen sind lang.
So einfach ist das:
-n
ist eine Option, wenn sie vor der Zeichenfolge angezeigt wird, andernfalls ist es nur eine weitere Zeichenfolge, die wiedergegeben werden soll.Entfernen Sie das
| md5sum
und Sie werden sehen, dass die Ausgabe anders ist.quelle
Nach einfacher Inspektion ist dies kein Fehler ...
Probieren Sie diesen Befehl selbst aus:
Sie werden feststellen, dass der resultierende md5 ist
Sie haben gerade die Verwendung von -n im Echo verwechselt.
In Ihrem ersten Beispielcode
-n wird verwendet, um zu sagen, dass nach diesem Echo KEINE neue Zeile eingefügt werden soll.
Ihre zweite Probe
behandelt -n als wörtlichen Text.
quelle