ls出力のファイル名間のマジックセパレーターは何ですか?


20

ls(引数なし)の出力は、ファイル名を改行で区切るように見えます。

証拠:

  • ls | grep foogrep各ファイル名を個別の入力行として扱うことで、期待どおりに機能します。

  • ls > files.txt; vim files.txt -> Vimでは、各ファイルは別々の行にあります

さらに、ターミナルでlsは、複数のファイルが1行に出力され、ファイル名がスペースで区切られて、列が適切に配置されます。

$ ls
a.txt  b.txt  c.txt

だから私の質問は、lsはこれをどのように行うのですか?

改行を「偽造」するために特別な制御文字を使用していますか?または、その出力が別のコマンドにパイプされていることを知っており、この場合は出力を異なる形式にしますか?

回答:


24

または、その出力が別のコマンドにパイプされていることを知っており、この場合は出力を異なる形式にしますか?

はい。完全なマニュアルから(info lsドキュメントがインストールされている場合に利用可能):

標準出力が端末の場合、出力は列(垂直にソート)にあり、制御文字は疑問符として出力されます。それ以外の場合、出力は1行に1つずつリストされ、制御文字はそのまま出力されます。

1列の出力が必要な場合は、実行できます

ls -1

ターミナルでも取得します。


7
具体的には、この関数lsは、出力が端末であるかどうかを判断するために使用しisatty(3)ます。
Blrfl

また、多少関連性がtty -sあります。これを単純なシェルスクリプトでテストする場合は、実行して戻りステータスを確認できます。
ダニエルアンダーソン

10

ls出力をパイプするときにそれを検出します。あなたはドキュメントでそれを見ることができます:

標準出力が端末の場合、出力は列(垂直にソート)にあり、制御文字は疑問符として出力されます。それ以外の場合、出力は1行に1つずつリストされ、制御文字はそのまま出力されます。

パイプのリダイレクトに関係なく、出力内の各ファイルを別々の行に配置する場合は、次を使用できます。

ls -1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.