関係lsとdir
lsとdir同様に動作する個別のプログラムです。以下で説明および参照するように、目的は、出力が端末に送信されるかどうかに応じて出力が変化しないdirようなコマンドを提供するlsことです。これをdir有効に実現するには、端末で表示する場合とファイルまたはパイプに書き込む場合の両方で合理的かつ有用な方法で出力をフォーマットする必要があります。
次の2つの一般的な誤解がありますdir。
- 多くの人
dirがのエイリアスであると信じていますが、そうlsではありません。どちらのコマンドも他のコマンドのエイリアスでdirはなく、Ubuntuではデフォルトでエイリアスではありません。lsまたdir、同一ではない別個の実行可能ファイルによって提供されます。
- 多くの人々は
dir、あいまいな歴史的理由、または標準または他のOSとの互換性を提供するために存在すると考えています。それもそうではありません。ls互換性のために行うように動作します。 dirこれは、標準のUnixコマンドではないため互換性がなくてもかまいませんが、開発者が独自の方法で価値があり、場合によっては望ましいと考える代替方法で動作します。
わかりましたが、正確にどのようlsにdir違いますか?
両方lsとdirディレクトリの内容を一覧表示します。デフォルトの動作における2つの特定の違いがそれらを区別します。
その場合は、標準出力が端末であり、ls垂直方向にソートされた列(のようにファイル名が一覧表示されますls -C)。標準出力が端末(ファイルやパイプなど)でない場合、ファイルls名を1行に1つずつリストします(などls -1)。
標準出力が端末であるかどうかにかかわらずdir、垂直にソートされた列(などls -C)にファイル名をリストします。
両方のためlsとdir、これらのデフォルト値は、によってオーバーライドすることができる--format=フラグによって-1、-C、-m、そして-x特に短縮フラグ、--format=オプション。詳細については、GNU coreutilsリファレンスマニュアルの「10.1.4一般的な出力フォーマット」を参照してください。
ときに、その標準出力は端子であり、列挙された対象のファイル名が含まれている制御文字、ls印刷?の代わりに、各制御文字(などls -q)。標準出力が端末でない場合、ls制御文字をそのまま(などls --show-control-chars)表示します。
その標準出力が端末であるかどうかに関係なくdir、シェルに入力された場合に特別に解釈される制御文字またはその他の文字を検出すると、その文字のバックスラッシュシーケンスを出力します。これには、スペースなどの比較的一般的な文字も含まれます。たとえば、dirというエントリをリストDocuments backupsしDocuments\ backupsます。これは次のようですls -b。
両方のためlsとdir、これらのデフォルト値は、に記載されているフラグで上書きすることができるファイル名フォーマット10.1.7におけるGNU coreutilsのリファレンスマニュアル。これには-b、-q、--quoting-style=、およびいくつかの他。
出典:LSの呼び出しやディレクトリの呼び出しでは、GNU coreutilsのリファレンスマニュアル。
どうしてdir?
別のdirユーティリティの理論的根拠は、「GNUコーディング標準のインターフェイスの標準4.5」に記載されています。このセクション全体を読んで開発者の理由を理解することをお勧めしますが、ここではls/に該当するハイライトを示しますdir。
ユーティリティの動作を、それを呼び出すために使用される名前に依存させないでください....
代わりに、実行時オプションまたはコンパイルスイッチ、あるいはその両方を使用して、代替動作の中から選択してください。
同様に、出力デバイスの種類に依存し、コマンドラインプログラムの振る舞いをしないでください....
互換性には、特定のプログラムが出力デバイスのタイプに依存する必要があります。すべてのユーザーが期待する方法でそうするか、そうしなかった場合ls、それは悲惨なshことです。これらのケースのいくつかでは、出力デバイスのタイプに依存しない優先代替バージョンでプログラムを補完します。たとえば、デフォルトの出力形式が常に複数列形式であることを除いて、dirプログラム
を提供してlsいます。
GNUプロジェクトは、技術的な観点から、(少なくともユーティリティのデフォルト設定では)書き込むデバイスの種類に応じてユーティリティが異なる出力を生成することは望ましくないと考えています。を含む一部のユーティリティでlsは、互換性のためにデバイス依存の出力が必要であるため、ユーザーの期待どおりに機能します。一部のユーザーは、このデバイス依存の動作を特に好んでいます。
一方でls、合理的に独立して、デバイスを動作するように書き込むことができませんでした、別のdirユーティリティがこれを達成するために作成されました。したがってdir、歴史的な互換性の理由で奇妙に動作するユーティリティはありません- lsです。
確認する方法ls、dirおよび関連するvdirユーティリティは参照、不要なコードの重複なしcoreutilsのソースコードで実装されているls-dir.c、ls-ls.c、ls-vdir.c、ls.h、とls.c。
あるdir本当に便利?
lsパイプless(ls | less)またはファイルにリダイレクト()した場合でも、複数列の出力を生成したいls > out.txt場合は、dirまたはを使用できますls -C。
で示されるファイル名を直接コピーlsし、引用符を気にせずにコマンドの一部として使用したい場合は、dirまたはを使用できますls -b。
dirls -Cbはと同等であるため、その意味では必要ありませんdir。しかしdir、実際にはしばしば有用なオプションの組み合わせを提供します(ただし、広く知られていません)。
なぜls(偶数ls -Cb)からカラー化された出力を取得しますが、取得しないのdirですか?!
ほとんどのUbuntuユーザーには、lswhichが実行されるというエイリアスがありますls --color=auto。lsエイリアスと外部コマンドの両方として存在する場合、シンプルでインタラクティブなコマンドではエイリアスが優先されます。
エイリアス定義は再帰的に展開されません。エイリアスが呼び出す外部lsコマンドです。エイリアスの機能の詳細については、Bashリファレンスマニュアルの6.6エイリアスを参照してください。ls--color=auto
、、または(およびのような他のコマンド)に渡されるlsとdir、出力が端末の場合は色を使用しますが、そうでない場合は使用しません。vdirgrep--color=auto
Ubuntuのデフォルトでは、ユーザーアカウントは次の場所で作成されます~/.bashrc:
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
あなたは気付くでしょうls(エイリアスalias ls='ls --color=auto')のものながら、コメント解除されているdirとはvdirでコメントアウトされている#ので、彼らは何の効果も取りません。つまり、一方でdir、別名ではありませんlsされ(ただしまでdir)。
dir色付きの出力も生成するにはどうすればよいですか?
でカラー出力を有効にdirするに.bashrcは、ホームディレクトリで編集し#alias dir='dir --color=auto'、先頭の#。変更後に開始されたシェルでdirは、エイリアスになります。
現在のシェルで変更が必要な場合は、コマンドとしてエイリアス定義を実行するか、を実行してソース.bashrcを取得できます. ~/.bashrc。
これはdirほぼ間違いなく、出力デバイスに関係なく同じ種類の出力を生成するという主な点に反します。しかしながら:
- この
dirエイリアスを作成すると便利な場合は、必ず作成してください。
- スクリプトなどで外部コマンドとして呼び出された場合、
\dirまたはを実行してエイリアスを上書きした場合でも、デバイスに依存しない出力が生成されます。これは、へのエイリアシングが実際に壊れないと言うことです。command dirdirdirdir --color=autodir
dir --color;)