Ls為什麼 echo
為什麼 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
但都在一行中,其中每一行由空格而不是新行分隔,例如: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'
引用!!
當您執行時
ls -l
,是的,它會生成換行符(當您報告時)。但是,當您這樣做echo
ls -l,
時,將看不到換行符。嘗試一下。原因是
...
構造是命令擴展,並且大多數擴展(還有其他擴展)受外殼拆分(未引用時)的影響。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