Warum hat echo `ls -l` keine Zeilenumbrüche?

Warum hat echo `ls -l` keine Zeilenumbrüche?

Ich verwende WSL (Windows-Subsystem für Linux) und wenn ich die ls -lFunktion auf dem Terminal verwende, werden neue Zeilen ausgedruckt, d. h. jede Datei steht in einer neuen Zeile, z. B.:

total 12K
drwxrwxrwx 1 user user 4.0K Apr  4 23:28 .
drwxr-xr-x 1 user user 4.0K Apr  4 23:28 ..
-rw-rw-rw- 1 user user    0 Mar 28 01:03 a1.file
-rw-rw-rw- 1 user user 4.5K Mar 23 16:27 books.xml
-rw-rw-rw- 1 user user    0 Mar 13 00:19 file1
-rw-rw-rw- 1 user user  513 Mar 13 00:19 file2.txt
-rw-rw-rw- 1 user user 2.8K Mar 13 12:42 file3.txt
-rw-rw-rw- 1 user user  405 Apr  4 23:26 ls_l.txt
-rw-rw-rw- 1 user user    0 Apr  4 23:28 ls_l2.txt
-rw-rw-rw- 1 user user   89 Mar 13 00:18 pattern
-rw-rw-rw- 1 user user   86 Mar 28 01:41 somefile.file

Wenn ich jedoch verwende echo `ls -l` > file1.txt, enthält es dasselbe wie ls -lnormal, jedoch alles in einer Zeile, wobei die einzelnen Zeilen durch Leerzeichen und nicht durch neue Zeilen getrennt sind, z. B.:

total 12K drwxrwxrwx 1 user user 4.0K Mar 27 22:45 . drwxr-xr-x 1 user user 4.0K Mar 27 22:45 .. -rw-rw-rw- 1 user user 4.5K Mar 23 16:27 books.xml -rw-rw-rw- 1 user user 0 Mar 13 00:19 file1 -rw-rw-rw- 1 user user 513 Mar 13 00:19 file2.txt -rw-rw-rw- 1 user user 2.8K Mar 13 12:42 file3.txt -rw-rw-rw- 1 user user 403 Mar 27 22:45 ls_l.txt -rw-rw-rw- 1 user user 89 Mar 13 00:18 pattern

Beachten Sie, dass ich diese relevanten Aliase habe:

alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls -lah'

Antwort1

Zitieren!!

Wenn Sie ausführen ls -l, werden tatsächlich Zeilenumbrüche generiert (wie Sie berichten). Wenn Sie dies tun, echo `ls -l` ,sind jedoch keine Zeilenumbrüche zu sehen. Probieren Sie es aus.

Der Grund dafür ist, dass eine `...`Konstruktion eine Befehlserweiterung ist und die meisten Erweiterungen (es gibt noch andere) von Shell-Splitting betroffen sind (wenn sie nicht in Anführungszeichen gesetzt sind). Shell-Splitting entfernt alle Zeichen in der Variable IFS, die standardmäßig enthält <space><tab><newline>. Alle Zeilenumbrüche aus ls -lwerden entfernt und die Zeichenfolge wird an dieser Stelle geteilt. Letzterer echokann jeden geteilten Teil zusammenfügen und sie durch ein einzelnes Leerzeichen trennen.

Also, ja, sowohl die alte, als auch die richtige und jederzeit vorzuziehende neue Variante:

echo `ls -l`
echo $(ls -l)

Listet die Dateien im aktuellen Verzeichnis in einer Zeichenfolge ohne Zeilenumbrüche auf, wenn IFS die Standardeinstellung ist.

Wenn Sie diesen String in eine Datei umleiten, wird erwartungsgemäß ein String in diese Datei geschrieben.

echo $(ls -l) > file

Um die Zeilenumbrüche beizubehalten, zitieren Sie die Erweiterung:

echo "$(ls -l)"

Oder vermeiden Sie bitte die Verwendung des veralteten `...`:

echo "`ls -l`"

Und um die Ausgabe in einer Datei zu erhalten, leiten Sie sie einfach in die Datei um:

echo "$(ls -l)" > file

verwandte Informationen