我正在運行 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