「dir」と「ls」端末コマンドの違いは?


74

私は、ターミナルdirlsコマンドとコマンドを使用することの違いを見つけようとしてきました。lsはディレクトリ内のファイルを表示する従来のUNIXの方法であり、これdirはWindowsのコマンドプロンプトと同等ですが、両方のコマンドがターミナルで機能することは知っています。

入力dirすると、ディレクトリ内のファイルとフォルダーが表示され、入力するとls、コンテンツの強調表示以外は同じように表示されます。両方のコマンドはオプションを受け入れます(つまりls -adir -a両方ともすべてのファイルとフォルダー、および隠しファイルを返します)。

だから、誰がどのような違いがあると理由の両方を知っているんdirls使用されているの?


7
dir --color;)
リンツウィンド

3
この質問に対する回答の多さに驚いたと言いたいだけです。これについて疑問に思ったのは私だけではなかったと思います:)
BretD

3
古代からのコマンドは、常に古いオタクを木工から
引きずり出し

回答:


70

dirおよびlsはの一部でcoreutilsあり、デフォルトのオプションが異なるだけでdir、とほぼ同じlsです。

GNUコアユーティリティは、GNUオペレーティングシステムの基本的なファイル、シェル、およびテキスト操作ユーティリティです。これらは、すべてのオペレーティングシステムに存在することが期待されるコアユーティリティです。

info dir 言う:

dirに等しいls -C -b; つまり、デフォルトではファイルは列にリストされ、垂直にソートされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。

ああ、またありvdirます!info vdir言う:

vdirに等しいls -l -b; つまり、デフォルトではファイルは長い形式でリストされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。

ほとんどのdir場合、後方互換性のために、または歴史的な理由により存在します。


私はそれがたぶん他の単なるエイリアスだと思っていました。理由は、Windowsユーザーが自宅でより快適に感じるようにすることだと思いましたlol徹底的な答えをありがとう!
BretD

4
alias dirそれが実際に何であるかを見るためにタイプしてください。入力aliasしてすべてのエイリアスを表示します。
user606723

2
@ user606723、「alias dir」は11.10で表示されません(少なくとも私にとっては)。「エイリアス」はローカルユーザーのエイリアス設定のみを表示し、システム全体は表示しないと考えています。
ジェームズ

入力type dirして、それが何であるかを確認します(エイリアス、コマンド、bash関数...)
ychaouche

49

関係lsdir

lsdir同様に動作する個別のプログラムです。以下で説明および参照するように、目的は、出力が端末に送信されるかどうかに応じて出力が変化しないdirようなコマンドを提供するlsことです。これをdir有効に実現するには、端末で表示する場合とファイルまたはパイプに書き込む場合の両方で合理的かつ有用な方法で出力をフォーマットする必要があります。

次の2つの一般的な誤解がありますdir

  • 多くの人dirがのエイリアスであると信じていますが、そうlsではありません。どちらのコマンドも他のコマンドのエイリアスでdirはなく、Ubuntuではデフォルトでエイリアスではありません。lsまたdir、同一ではない別個の実行可能ファイルによって提供されます。
  • 多くの人々はdir、あいまいな歴史的理由、または標準または他のOSとの互換性を提供するために存在すると考えています。それもそうではありません。ls互換性のために行うように動作します。 dirこれは、標準のUnixコマンドではないため互換性がなくてもかまいませんが、開発者が独自の方法で価値があり、場合によっては望ましいと考える代替方法で動作します。

わかりましたが、正確にどのようlsdir違いますか?

両方lsdirディレクトリの内容を一覧表示します。デフォルトの動作における2つの特定の違いがそれらを区別します。

  1. その場合は、標準出力が端末であり、ls垂直方向にソートされた列(のようにファイル名が一覧表示されますls -C)。標準出力が端末(ファイルやパイプなど)でない場合、ファイルls名を1行に1つずつリストします(などls -1)。

    標準出力が端末であるかどうかにかかわらずdir、垂直にソートされた列(などls -C)にファイル名をリストします。

    両方のためlsdir、これらのデフォルト値は、によってオーバーライドすることができる--format=フラグによって-1-C-m、そして-x特に短縮フラグ、--format=オプション。詳細については、GNU coreutilsリファレンスマニュアルの10.1.4一般的な出力フォーマット」参照してください。

  2. ときに、その標準出力は端子であり、列挙された対象のファイル名が含まれている制御文字ls印刷?の代わりに、各制御文字(などls -q)。標準出力が端末でない場合、ls制御文字をそのまま(などls --show-control-chars)表示します。

    その標準出力が端末であるかどうかに関係なくdir、シェルに入力された場合に特別に解釈される制御文字またはその他の文字を検出すると、その文字のバックスラッシュシーケンスを出力します。これには、スペースなどの比較的一般的な文字も含まれます。たとえば、dirというエントリをリストDocuments backupsDocuments\ backupsます。これは次のようですls -b

    両方のためlsdir、これらのデフォルト値は、に記載されているフラグで上書きすることができるファイル名フォーマット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です

確認する方法lsdirおよび関連するvdirユーティリティは参照、不要なコードの重複なしcoreutilsのソースコードで実装されているls-dir.cls-ls.cls-vdir.cls.h、とls.c

あるdir本当に便利?

lsパイプlessls | less)またはファイルにリダイレクト()した場合でも、複数列の出力を生成したいls > out.txt場合は、dirまたはを使用できますls -C

示されるファイル名を直接コピーls引用符を気にせずにコマンドの一部として使用したい場合は、dirまたはを使用できますls -b

dirls -Cbはと同等であるため、その意味では必要ありませんdir。しかしdir、実際にはしばしば有用なオプションの組み合わせを提供します(ただし、広く知られていません)。

なぜls(偶数ls -Cb)からカラー化された出力を取得しますが、取得しないのdirですか?!

ほとんどのUbuntuユーザーには、lswhichが実行されるというエイリアスがありますls --color=autolsエイリアスと外部コマンドの両方として存在する場合、シンプルでインタラクティブなコマンドではエイリアスが優先されます。

エイリアス定義は再帰的に展開されません。エイリアスが呼び出す外部lsコマンドです。エイリアスの機能の詳細については、Bashリファレンスマニュアルの6.6エイリアスを参照してください。ls--color=auto

、、または(およびのような他のコマンド)に渡されるlsdir、出力が端末の場合は色を使用しますが、そうでない場合は使用しません。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

質の高い回答ですが、ToCまたはTL; DRを使用できます。:)
ケビン

5

私はそれdir後方互換性のためだけあると思う傾向があります。

GNU Coreutilsから:

dirはls -C -bと同等です。つまり、デフォルトではファイルは列にリストされ、垂直にソートされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。

ところで、lsデフォルトでは出力を色付けしません:これは、ほとんどのディストリビューションlsls --color=autoinのエイリアスであるためです /etc/profile.d。テストの場合は、タイプしてunalias lsから試してくださいls。無色になります。

出典:ルナン答え『DIR』と『LS』の違いは何


dirされていない後方互換性のために提供 -そしてls実際にある -この答え(およびそれから引用答え)を正しく二つのコマンド間の技術的な違いを述べるだけでなく、一般的に観測されたカラー化の違いを説明しません。+1。
エリアケイガン

3

疑わしい場合は、type lsvsを比較しますtype dirlsとlaの違いも参照)。

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

違いは、次のさまざまなオプションに要約されます。ls私の場合--color=tty、最も見やすいのですが、システムは異なる場合があります。


2
これは、デフォルトのUbuntuユーザー設定とはまったく思えません。私は私が使用したUbuntuのシステムのいずれかを持っていたと思うしていないlsという関数の別名として_lsもないでコメントアウトされたラインとして- .bashrc。(少なくともいくつかのバージョンの)openSuSEのデフォルトのように見えますが、この会話このファイル(そこからリンクされている)、およびopenSUSEを最後に使用したときの(間違いなく間違っている)メモリーから判断します
エリアケイガン

2
@EliahKagan:ご想像のとおり、私はOpenSuseを使用しています!したがって、私が言ったように、結果は異なりますが、方法は大丈夫です。
user2394284

2

短い答え:なし 、バイナリdirと同じソースコードはデフォルトであります。(1行のコードdiff)lsls--color


7
dirはのエイリアスではありませんls。それらは/usr/binRinzwind回答で説明されているように、異なる動作をする別個のバイナリです。エイリアスでこれを実現できますが、それは実現方法ではありません。セパレートdirlsバイナリが使用するすべてのシステム上で表示されるGNUのCoreutilsを。証明が必要な場合は、を実行しcmp /bin/ls /bin/dirます。
エリアケイガン

2
しばらく前はエイリアスであり、を入力するだけでエイリアスリストに表示されていましたalias。新しいバイナリがdir用にコンパイルされました。次の方法でコードをダウンロードできますgit clone git://git.sv.gnu.org/coreutils。ls-dir.cで変更されるコードは1行のみで、次のとおりint ls_mode = LS_MULTI_COL;です。技術的にはエイリアスではありませんが、実際にはLSですが、デフォルトオプションが異なります(1行のコード)。
フランシスコバルデス

1
はい、dirあるls別のデフォルトのオプションではなくdirまた、lsGNU Coreutilsを使用するディストリビューションでは常に別個のバイナリでした。一部のディストリビューションでは、別名と呼ばれるエイリアス定義されている場合がありますdir(既存のコマンドと同じ名前のエイリアスを定義することは非常に一般的です)。しかし、それらは別個の実行可能ファイルです。シェルエイリアス(ファイルではない)と同様のソースコードを持つ別の実行可能ファイルを区別することは、教訓的な区別ではありません。それがUbuntuでのdir別名であると言うのは偽りであり、誤解を招くかもしれませんls
エリアケイガン

はい、私はあなたに同意しますが、この場合、同様のソースコードではなく、同じソースコードです。エイリアスがリストされているものであると言うと、aliasもちろんエイリアスではありません。
フランシスコバルデス

3
同じソースコードではありません。あなたが言ったように、「ソースの1行が変更されます。」そして、それが同じソースであった場合、それはまだエイリアスではありません。Unixライクなシステムには、エイリアスにていますが、エイリアスを呼び出す初心者にとっては非常に混乱する(そして経験豊富なユーザーを怒らせる)ものがたくさんあります。シンボリックリンク、ハードリンク、同一ファイル、類似ファイル、ラッパースクリプト、実行可能ファイルを隠しているシェルビルトイン、および同期ファイル(UbuntuOneなど)はすべて、重要な点でエイリアスに似ていますが、エイリアスではありません。
エリアケイガン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.