私はシェルに関する比較的基本的な点を見落としたかもしれないと思います。出力エルエスデフォルトでは、コマンドは出力を改行で区切りますが、シェルは出力を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
答え1
出力をパイプするときのls
動作は異なります。
この事実は隠されています情報文書:
標準出力が端末の場合、出力は列に並べられ(縦に並べられ)、制御文字は疑問符として出力されます。それ以外の場合、出力は 1 行に 1 つずつ表示され、制御文字がそのまま出力されます。
これを実演するには、以下を実行してください。
ls
それから
ls | less
これは、パイプまたはリダイレクトのいずれに関係なく、1行に1つのファイル出力を保証するには、次のように実行する必要があることを意味します。
ls -1
(-1
1位です)
あるいは、以下をls | less
実行して列ごとに強制的に出力することもできます。
ls -C
(-C
大文字Cです)
答え2
あなたの調査は、解析された出力が常に悪い考えである主な理由を強調しますls
。 Gregのwikiを見る完全な説明。
問題を逆に考えてみてください。 lsは時々出力の間に改行文字を印刷しますが、時にはそうでない場合があります。これは、スクリプトで使用されているかフラグによって強制される場合でも-1
同様です。各ファイルの末尾に改行文字があります。何を持って各改行文字が新しいファイル名を表すという保証はありません。。実際、ファイル名自体に改行文字が含まれていると、ls出力をまったく解析できません。次のファイル名を検討してください。
file1
file2\nfile3
file4
ディレクトリにこのディレクトリが含まれている場合は、ls -1
次の内容が表示されます。
file1
file2
file3
file4
当然4つのファイルがあると思いませんか? ls出力を解析するすべてのスクリプトでも同様です。実際には3つのファイルがあり、そのうちの1つは名前が面倒ですが、ls.*の出力ではそれを見つけることはできません。
*このフラグを使用して出力が中断されたことを確認しない限り、-l
スクリプトはブロックされ続けます。