Die gemischte Geschichte von echo
bedeutet, dass seine Standardoperation von Shell zu Shell unterschiedlich ist. POSIX gibt an, dass das Ergebnis von echo
ist „implementierungsdefiniert“, wenn das erste Argument -n
ist oder irgendein Argument enthält einen umgekehrten Schrägstrich.
Es ist zuverlässiger, printf
zu verwenden (entweder als eingebauter Befehl oder als externer Befehl), wobei das Verhalten besser definiert ist:Die Backslash-Escapezeichen im C-Stil und Formatbezeichner werden in der Formatzeichenfolge (dem ersten Argument) unterstützt.
printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar
Sie können die Erweiterung von Backslash-Escape-Sequenzen von bash steuern ist echo
eingebauter Befehl mit dem xpg_echo
Shell-Option.
Setzen Sie es oben auf eine beliebige Bash Skript, um echo
zu erstellen Backslash-Escapes automatisch erweitern, ohne dass -e
hinzugefügt werden muss zu jedem Echo-Befehl.
shopt -s xpg_echo
echo 'foo\nbar'
Die empfohlene Vorgehensweise ist die Verwendung von printf
für alle neuen Skripte.
printf '%s\n%s\n' "Hello" "World"
printf '%s\n' "Hello\nWorld"
Wenn Sie bash myfile.sh
verwenden , Bash wird im "Batch"-Modus auf einem separaten ausgeführt verarbeiten, und nicht Lesen Sie sein Profil oder seine RC-Datei.
Wenn Sie . myfile.sh
verwenden , die Datei ist bezogen durch den aktuellen Shell-Prozess (als ob sein Inhalt von Ihnen eingegeben worden wäre), daher sieht es Ihre aktuell definierten Aliase.
Im Allgemeinen ist es eine sehr schlechte Idee, Skripte zu schreiben, die von einer bestimmten Shell-Konfiguration abhängen, insbesondere Aliase, es sei denn, Sie definieren sie im Skript selbst. (Niemals Verlassen Sie sich auf .bashrc
des Benutzers , auch wenn es Ihre eigene ist.)