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 wie echo
.
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 dies echo
so praktisch ist, haben Sie Tausende von Shell-Skripten, die von dem einen oder anderen Verhalten abhängen:
echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --
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 Sieprintf
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.
echo -n "bar"
gibt "bar", währendecho "bar" -n
gibt "bar -n"