lsからの出力には改行がありますが、1行で表示されます。どうして?


41

私は、シェルに関する比較的基本的なポイントを見落としていると思います。デフォルトでは、lsコマンドからの出力は出力を改行で区切りますが、シェルは出力を1行で表示します。

誰も私にこれを説明できますか?出力は単にスペースで区切られていると常に思っていましたが、改行で区切られた出力が表示されるようになったので、出力が別の行に表示されるはずです。

例:

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

回答:


44

出力をパイプすると、ls動作が異なります。

この事実は情報ドキュメントに隠されています

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

それを証明するために、実行してみてください

ls

その後

ls | less

これは、パイプまたはリダイレクトされているかどうかに関係なく、出力が1行につき1ファイルであることを保証する場合、実行する必要があることを意味します

ls -1

-1ナンバーワンです)

または、次のls | lessコマンドを実行して、強制的に列に出力することができます

ls -C

-C大文字のCです)


6
@theconnorpower:それはほとんどに固有lsです。これは便利ですが、明らかに一貫性がなく、驚くべきものです。ただし、色付きの出力を生成する一部のコマンドは、パイプされたときに色を削除することに注意してください。
ミケル

5
@theconnorpower:雑学:Unixの発明者はPlan9を書き続けました。Plan9では、ls常に1行に1つずつlc印刷され、常に列に印刷されます。
ミケル

2
@theconnorpower:端末のサイズを読み取り、それに応じて出力を調整するプログラムもあります。たとえば、Debian dpkg -lでは画面の幅全体を使用しますが、パイプに出力する場合は、端末が80列幅であると想定します、必要に応じて出力が収まるように出力を省略します。
ミケル

1
@Mikel Plan9のls / lcの違いを聞いて興味深い。詳細な回答をありがとう。
zod90

1
プログラムは、出力がファイルにリダイレクトされるかどうか、またはシェルに送信されるかどうかをどのように判断できますか?
user2820379 14

4

あなたの発見lsは、出力の解析が常に悪い考えである主な理由を強調しています。詳細な説明については、Gregのwikiを参照してください。

問題を逆に考えてください。lsは、出力間で改行を出力する場合としない場合があります。スクリプトで使用する場合、または-1フラグによって強制される場合、使用します。各ファイルの最後に1つの改行。各改行が新しいファイル名を表すという保証はありません。実際、ファイル名に改行自体が含まれている場合、lsの出力は完全には解析できません。これらのファイル名を考慮してください:

file1
file2\nfile3
file4

それをls -1含むディレクトリを作成すると、次のように表示されます。

file1
file2
file3
file4

4つのファイルがあると自然に想定していませんか?lsの出力を解析するスクリプトも同様です。実際には3つのファイルがあり、そのうちの1つには扱いにくい名前が付いていますが、ls。*の出力からそれを把握することはできません。

* -lフラグを使用していて、出力が中断されていることに気付いた場合を除き、スクリプトは依然として停止します。


3
の出力を本当に解析する必要がある場合はls、この-bオプションが役立ちます。改行を\nなどに変換します
Mikel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.