echo `ls -l`に改行文字がないのはなぜですか? [コピー]

echo `ls -l`に改行文字がないのはなぜですか? [コピー]

WSL(Linux用のWindowsサブシステム)を実行していて、ls -l端末で関数を使用すると、新しい行が印刷されます。つまり、各ファイルが新しい行に表示されます。たとえば、次のようになります。

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

ただし、これを使用するとecho `ls -l` > file1.txt通常と同じですls -lが、すべて1行にあり、各行は新しい行ではなく空白で区切られます。次のようになります。

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

次の関連エイリアスがあります。

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

答え1

引用!

を実行するとls -l、はい、報告したように改行文字が生成されます。ただし、これによりecho `ls -l` ,改行文字は表示されません。試してみてください。

その理由は、`...`構文がコマンド拡張であり、ほとんどの拡張(他のうち)がシェル分割(引用符でない場合)の影響を受けるためです。シェル分割は、デフォルトでIFSを含む変数からすべての文字を削除します<space><tab><newline>。すべての改行はls -l削除され、文字列はこの時点で分割されます。後者はecho各分割を連結し、スペースで区切る。

はい。古いものと正しいもの、そして新しいものは常に好まれます。

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

IFSがデフォルトの場合、現在のディレクトリのファイルは改行なしで文字列として一覧表示されます。

文字列をファイルにリダイレクトすると、期待どおりに文字列がファイルに書き込まれます。

echo $(ls -l) > file

改行を維持するには、拡張子を引用してください。

echo "$(ls -l)"

または、使用されなくなった次のものを使用しないでください`...`

echo "`ls -l`"

ファイルに出力を取得するには、ファイルにリダイレクトするだけです。

echo "$(ls -l)" > file

関連情報