Bash

ls 的輸出有換行符,但顯示在一行上。為什麼?

  • September 12, 2019

我想我可能忽略了關於 shell 的一個相對基本的觀點。預設情況下,ls命令的輸出用換行符分隔輸出,但 shell 在單行上顯示輸出。

誰能給我解釋一下?我一直認為輸出只是用空格分隔,但現在我看到輸出用換行符分隔,我希望輸出顯示在單獨的行上。

例子:

cpoweradm@debian:~/lpi103-4$ ls text*
text1  text2  text3

od顯示輸出由換行符分隔:

cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000   t   e   x   t   1  \n   t   e   x   t   2  \n   t   e   x   t
0000020   3  \n
0000022

如果存在換行符,那麼為什麼輸出不顯示為:

text1 
text2
text3

當您通過管道輸出輸出時,ls行為會有所不同。

這個事實隱藏在資訊文件中:

如果標準輸出是終端,則輸出按列(垂直排序),控製字元作為問號輸出;否則,輸出每行列出一個,控製字元按原樣輸出。

為了證明這一點,嘗試執行

ls

然後

ls | less

這意味著如果您希望保證輸出是每行一個文件,無論它是通過管道傳輸還是重定向,您都必須執行

ls -1

-1是第一名)

或者,您可以通過執行強制ls | less在列中輸出

ls -C

-C是大寫的C)

引用自:https://unix.stackexchange.com/questions/10421