![为什么 echo `ls -l` 没有换行符?](https://linux22.com/image/170460/%E4%B8%BA%E4%BB%80%E4%B9%88%20echo%20%60ls%20-l%60%20%E6%B2%A1%E6%9C%89%E6%8D%A2%E8%A1%8C%E7%AC%A6%EF%BC%9F%20.png)
我正在运行 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
但全部在一行中,每一行由空格分隔,而不是新行,例如:
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` ,
看不到换行符。尝试一下。
原因是`...`
构造是命令扩展,并且大多数扩展(还有其他)都受到 shell 分割(未引用时)的影响。 Shell 拆分会删除变量 中的任何字符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