echo
Eine echo
Implementierung, die sich strikt an die Single Unix-Spezifikation hält, fügt neue Zeilen hinzu, wenn Sie Folgendes tun:
echo 'line1\nline2'
Das ist aber kein verlässliches Verhalten. Tatsächlich gibt es wirklich kein Standardverhalten, das Sie erwarten können echo
.
OPERANDEN
string
Ein String, der in die Standardausgabe geschrieben werden soll. Ist der erste Operand -n
oder enthält einer der Operanden ein < \
Backslash> -Zeichen, sind die Ergebnisse implementierungsdefiniert .
Auf XSI-konformen Systemen wird der erste Operand -n
als Zeichenfolge und nicht als Option behandelt . Die folgenden Zeichenfolgen müssen auf XSI-konformen Systemen innerhalb eines der Argumente erkannt werden:
\a
- Schreiben Sie einen <alert> .
\b
- Schreiben Sie ein <Backspace> .
\c
- Unterdrücken Sie die <newline> , die ansonsten auf das letzte Argument in der Ausgabe folgt. Alle Zeichen, die den \c
in den Argumenten folgen , werden ignoriert.
\f
- Schreiben Sie einen <Formular-Feed> .
\n
- Schreiben Sie eine <newline> .
\r
- Schreiben Sie einen <Wagenrücklauf> .
\t
- Schreiben Sie ein <tab> .
\v
- Schreiben Sie einen <Vertical-Tab> .
\\
- Schreiben Sie ein <Backslash> -Zeichen.
\0num
- Schreiben Sie einen 8-Bit-Wert, der die null-, ein-, zwei- oder dreistellige Oktalzahl ist num
.
Und so gibt es wirklich keinen allgemeinen Weg, wie man eine neue Zeile schreibt echo
, außer dass man sich im Allgemeinen darauf verlassen kann echo
, dies einfach zu tun.
Eine bash
Shell entspricht normalerweise nicht der Spezifikation und behandelt die -n
und andere Optionen, aber auch das ist ungewiss. Du kannst tun:
shopt -s xpg_echo
echo hey\\nthere
hey
there
Und nicht einmal das ist notwendig, wenn bash
mit der Build-Time-Option gebaut wurde ...
--enable-xpg-echo-default
echo
Veranlassen Sie das eingebaute Expandieren von Zeichen mit umgekehrten Schrägstrichen standardmäßig, ohne dass die -e
Option erforderlich ist . Dies setzt den Standardwert der xpg_echo
Shell-Option auf on
, wodurch sich die Bash echo
mehr wie die in der Single Unix Specification, Version 3, angegebene Version verhält . Eine Beschreibung der echo
erkannten Escape-Sequenzen finden Sie unter Bash Builtins .
printf
Auf der anderen Seite ist printf
das Verhalten im Vergleich ziemlich zahm.
RATIONALE
Das printf
Dienstprogramm wurde hinzugefügt, um Funktionen bereitzustellen, die in der Vergangenheit von bereitgestellt wurden echo
. Aufgrund der unüberbrückbaren Unterschiede in den verschiedenen vorhandenen Versionen echo
weist die Version jedoch nur wenige Besonderheiten auf, so dass diese diesem neuen printf
Dienstprogramm überlassen bleiben, das auf einem Dienstprogramm im neunten Editionssystem basiert.
Der Abschnitt EXTENDED DESCRIPTION (ERWEITERTE BESCHREIBUNG) entspricht fast genau der printf()
Funktion im ISO-C-Standard, obwohl er in der Dateiformatnotation in der XBD-Dateiformatnotation beschrieben wird .
Es behandelt Format-Strings, die ihre Argumente beschreiben - das kann eine beliebige Anzahl von Dingen sein, aber für Strings sind es so ziemlich entweder %b
Yte-Strings oder Literal- %s
Trings. Anders als die %f
Ormats im ersten Argument verhält es sich am %b
ähnlichsten wie ein Yte-String-Argument, außer dass es das \c
Escape nicht behandelt .
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Sehen Sie, warum ist printf
besser als echo
? für mehr.
echo() printf
Sie könnten Ihre eigenen Standards konform schreiben echo
wie ...
echo(){
printf '%b ' "$@\n\c"
}
... was eigentlich immer automatisch das Richtige tun sollte.
Eigentlich nein ... Das gibt ein Literal \n
am Ende der Argumente aus, wenn das letzte Argument mit einer ungeraden Anzahl von <Backslashes> endet .
Das tut es aber nicht:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echo
obligatorisch? Sie können verwendenprintf
.