Eine newline entspricht zwei newlines in bash?

383
Javad

Während ich ein Python-Programm testete, an dem ich gearbeitet habe, habe ich das bemerkt echo -e "\n"und printf "\n"entsprechend der ifAussage in bash.

Auch wenn echo -e "\n"druckt zwei neue Zeilen (es hängt eine Standardeinstellung) und printf nur ein druckt.

if [ "$(echo -e "\n")" == "$(printf "\n")" ] then echo 1 fi 

und

if [ $(echo -e "\n") -eq $(printf "\n") ] then echo 1 fi 

beide Ausgänge 1 in Bash. Ich habe auch bemerkt, dass die Ausgänge zu einer Variablen zugewiesen gibt nur einen einzigen Newline für beide echo -e "\n"und printf "\n",

A=$(echo -e "\n") B=$(printf "\n")  echo $A # outputs a single newline echo $B # also outputs a single newline 

Ich denke also, dass echodie Zeile mit fx möglicherweise anders ausgegeben wird. stderr?

0

1 Antwort auf die Frage

2
Toni Dietze

Die Zeilenumbrüche werden durch die Befehlsersetzung gelöscht $(). Die Manpage von bash sagt:

Durch die Befehlsersetzung kann die Ausgabe eines Befehls den Befehlsnamen ersetzen. Es gibt zwei Formen:

$(command) 

oder

`command` 

Bash führt die Erweiterung durch, indem der Befehl in einer Subshell-Umgebung ausgeführt wird und die Befehlsersetzung durch die Standardausgabe des Befehls ersetzt wird, wobei nachstehende Zeilenumbrüche gelöscht werden . Eingebettete Zeilenumbrüche werden nicht gelöscht, sie können jedoch während der Wortaufteilung entfernt werden. Die Befehlsersetzung $ (cat- Datei ) kann durch die gleichwertige, aber schnellere $ (< Datei ) ersetzt werden.

@JavadSM Übrigens, selbst wenn `$ ()` die Zeilenumbrüche nicht entfernt hat, wenn die Anführungszeichen nicht notiert sind, behandelt die Shell diese Zeilenumbrüche als Leerzeichen und ignoriert sie. Daher wird `[$ (echo -e" \ n ") -eq $ (printf" \ n ")]` auf das Äquivalent von [-eq] `analysiert, was wahr ist, da" -eq "nicht der ist Nullzeichenfolge `[$ (echo -e" \ n ") -ne $ (printf" \ n ")]` und `[$ (echo -e" \ n ") wibble $ (printf" \ n ")]` geben das gleiche Ergebnis aus dem gleichen Grund. Moral: Verwenden Sie doppelte Anführungszeichen um fast alle Befehls- und Variablenerweiterungen, um das Parsen von Verrücktheiten zu vermeiden. Gordon Davisson vor 6 Jahren 0