echo `ls -l` に改行がないのはなぜですか?

echo `ls -l` に改行がないのはなぜですか?

ls -l私は WSL (Windows Subsystem for Linux) を実行しており、ターミナルで関数を使用すると、新しい行が印刷されます。つまり、各ファイルが新しい行に表示されます。例:

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分割された各部分を 1 つのスペースで区切って結合します。

つまり、古いものと、いつでも正しく優先される新しいものの両方です。

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

IFS がデフォルトの場合、現在のディレクトリ内のファイルを改行なしの 1 つの文字列でリストします。

その文字列をファイルにリダイレクトすると、予想どおり、そのファイルに 1 つの文字列が書き込まれます。

echo $(ls -l) > file

改行を保持するには、展開部分を引用符で囲みます。

echo "$(ls -l)"

または、非推奨の`...`: の使用は避けてください。

echo "`ls -l`"

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

echo "$(ls -l)" > file

関連情報