ls
(引数なし)の出力は、ファイル名を改行で区切っているように見えます。
証拠:
ls | grep foo
は期待どおりに機能し、grep
は各ファイル名を個別の入力行として扱います。
ls > files.txt; vim files.txt
-> Vimでは、各ファイルは別々の行にあります
それでも、ターミナルでは、ls
の出力により、複数のファイルが1行に配置され、ファイル名がスペースで区切られて、適切に配置された列が作成されます。
$ ls
a.txt b.txt c.txt
だから私の質問は、lsはこれをどのように行うのですか?
改行を「偽造」するために特別な制御文字を使用していますか?または、出力が別のコマンドにパイプされていることを認識しており、この場合は出力の形式を変えますか?
または、出力が別のコマンドにパイプされていることを認識しており、この場合は出力の形式を変えますか?
はい。完全なマニュアルから(ドキュメントがインストールされている場合はinfo ls
から入手可能):
標準出力が端末の場合、出力は列(垂直方向にソート)になり、制御文字は疑問符として出力されます。それ以外の場合、出力は1行に1つずつリストされ、制御文字はそのまま出力されます。
1列の出力が好きな場合は、実行できます
ls -1
ターミナルでも入手できます。
ls
は、出力をパイプ処理するときにそれを検出します。あなたはそれをドキュメンテーションで見ることができます:
標準出力が端末の場合、出力は列(垂直方向にソート)になり、制御文字は疑問符として出力されます。それ以外の場合、出力は1行に1つずつリストされ、制御文字はそのまま出力されます。
パイプのリダイレクトに関係なく、出力内の各ファイルを別々の行に配置する場合は、次を使用できます。
ls -1