私は、ターミナルでdir
コマンドとls
コマンドを使用することの違いを見つけようとしました。 lsはディレクトリ内のファイルを表示する従来のUNIXの方法であり、dir
はwindowsコマンドのPromptと同等ですが、両方のコマンドが端末で機能することは知っています。
dir
と入力すると、ディレクトリ内のファイルとフォルダーが表示され、ls
と入力すると、コンテンツの強調表示を除いて同じことが行われます。どちらのコマンドもオプションを受け入れます(つまり、ls -a
とdir -a
は両方とも、すべてのファイルとフォルダー、および隠しファイルを返します。
だから誰が違いが何であるか、そしてdir
とls
の両方が使用される理由を知っていますか?
dir
とls
は coreutils
の一部であり、dir
はls
とほとんど同じですが、異なるデフォルトオプションがあります。
GNUコアユーティリティは、GNUオペレーティングシステムの基本ファイル、シェル、およびテキスト操作ユーティリティです。これらは、すべてのオペレーティングシステムに存在することが期待されるコアユーティリティです。
info dir
のコメント:
dir
はls -C -b
と同等です。つまり、デフォルトでは、ファイルは列にリストされ、垂直にソートされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。
ああ、vdir
もあります! info vdir
のコメント:
vdir
はls -l -b
と同等です。つまり、デフォルトではファイルは長い形式でリストされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。
おそらく、dir
は、下位互換性のために、または歴史的な理由により存在します。
ls
とdir
の関係ls
およびdir
は、同様に動作する別個のプログラムです。以下で説明し、参照するように、dir
の目的は、ls
のようなコマンドを提供することです。そのコマンドの出力は、ターミナルに行くかどうかによって変化しません。これを有効に実現するために、dir
は、端末での表示とファイルまたはパイプへの書き込みの両方に適切で便利な方法で出力をフォーマットする必要があります。
dir
には2つの一般的な誤解があります。
dir
はls
のエイリアスであると多くの人が信じていますが、そうではありません。どちらのコマンドも他のコマンドのエイリアスではありません。Ubuntuでは、デフォルトでdir
はエイリアスではありません。 ls
およびdir
は、別個の同一でない実行可能ファイルによって提供されます。dir
が歴史的な理由がはっきりしないか、何らかの標準または他のOSとの互換性を提供するために存在すると考えています。それも事実ではありません。 ls
は互換性のために動作します。dir
は標準のUnixコマンドではないため互換性がなくても、開発者がその中で価値があると考える代替方法で動作します自分の権利であり、おそらく望ましい。ls
とdir
はどう違うのですか?ls
とdir
は両方とも、ディレクトリの内容をリストします。デフォルトの動作における2つの特定の違いがそれらを区別します。
標準出力 が端末の場合、ls
は、垂直にソートされた列にファイル名をリストします(ls -C
など)。標準出力が端末ではない場合(たとえば、ファイルまたは pipe )、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
の両方について、これらのデフォルトは GNU coreutilsリファレンスマニュアル の 10.1.7ファイル名のフォーマット にリストされているフラグによって上書きされる場合があります。これには、-b
、-q
、--quoting-style=
などが含まれます。
Sources: GNU coreutils reference manual の ls呼び出し および dir呼び出し .
dir
があるのはなぜですか?個別のdir
ユーティリティの理論的根拠は、- GNUコーディング標準 の 4.5インターフェースの標準 に記載されています。開発者の理由を理解するためにそのセクション全体を読むことをお勧めしますが、以下はls
/dir
に適用可能なハイライトです。
ユーティリティの動作を、その呼び出しに使用した名前に依存させないでください ....
代わりに、実行時オプションまたはコンパイルスイッチ、あるいはその両方を使用して、代替動作 .... から選択します。
同様に、コマンドラインプログラムの動作を出力デバイスのタイプに依存させないでください ....
互換性のためには、特定のプログラムが出力デバイスのタイプに依存する必要があります。
ls
またはsh
がすべてのユーザーが期待する方法でそうしなかった場合、悲惨なことになるでしょう。これらのケースのいくつかでは、出力デバイスのタイプに依存しない優先代替バージョンでプログラムを補完します。たとえば、デフォルトの出力形式が常に複数列形式であることを除いて、dir
によく似たls
プログラムを提供します。
GNUプロジェクトは、技術的な観点から、ユーティリティが書き込み先のデバイスの種類に応じて異なる出力を生成することは望ましくないと考えています(少なくともユーティリティのデフォルト構成では)。 ls
を含む一部のユーティリティでは、互換性のためにデバイス依存の出力が必要であるため、ユーザーの期待どおりに機能します。一部のユーザーは、このデバイス依存の動作を特に好んでいます。
ls
はデバイスを独立して動作させるために合理的に記述できませんでしたが、これを実現するために別のdir
ユーティリティが作成されました。したがって、dir
は、歴史的な互換性のために奇妙な動作をするユーティリティではありません。--ls
is。
ls
、dir
、および関連するvdir
ユーティリティが、不要なコードの重複なしにcoreutilsソースコードにどのように実装されているかを確認するには、 ls-dir.c
、 ls-ls.c
、 ls-vdir.c
を参照してください=、 ls.h
、および ls.c
。
dir
は本当に便利ですか?ls
(ls | less
)にパイプしたり、ファイル(ls > out.txt
)にリダイレクトした場合でも、less
が複数列の出力を生成したい場合は、dir
またはls -C
を使用できます。
ls
で示されるファイル名を直接コピーし、引用符を気にせずにコマンドの一部として使用したい場合、dir
またはls -b
を使用できます。
dir
はls -Cb
と同等であるため、その意味でdir
は必要ありません。ただし、dir
は、実際にはしばしば有用なオプションの組み合わせを提供します(広く知られていません)。
ls
(ls -Cb
でも)からカラー化された出力を得るのに、dir
ではないのですか?!ほとんどのUbuntuユーザーは、ls --color=auto
を実行するls
というエイリアスを持っています。 ls
がエイリアスと外部コマンドの両方として存在する場合、シンプルな対話型コマンドではエイリアスが優先されます。
エイリアス定義は再帰的に展開されません。これは、ls
エイリアスが--color=auto
で呼び出す外部のls
コマンドです。エイリアスの機能の詳細については、 Bashリファレンスマニュアル の 6.6エイリアス を参照してください。
ls
、dir
、またはvdir
(およびgrep
などの他のコマンド)に渡されると、--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
is (ただしdir
ではなく)です。
dir
も色付きの出力を生成するにはどうすればよいですか?dir
でカラー出力を有効にするには、ホームディレクトリで.bashrc
を編集し、先頭の#alias dir='dir --color=auto'
を削除して#
行のコメントを解除します。変更後に開始されたシェルでは、dir
がエイリアスになります。
現在のシェルで変更が必要な場合は、エイリアス定義をコマンドとして実行するか、.bashrc
を実行して. ~/.bashrc
を取得できます。
これはおそらく、dir
の主要な点に反します。出力デバイスに関係なく、同じ種類の出力を生成する必要があるということです。しかしながら:
dir
エイリアスを作成すると便利な場合は、必ず使用してください。\dir
またはcommand dir
を実行してエイリアスをオーバーライドする場合など、外部コマンドとして呼び出された場合、dir
はデバイスに依存しない出力を生成します。これは、dir
をdir --color=auto
にエイリアスしても、実際にはdir
を壊さないということです。
dir
はそこにあると思う傾向があります 後方互換性のため 。GNU Coreutils から:
dirはls -C -bと同等です。つまり、デフォルトでは、ファイルは列にリストされ、垂直にソートされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。
ところで、
ls
はデフォルトで出力を色付けしません:これは、ほとんどのディストリビューションがls --color=auto
の/etc/profile.d
にls
をエイリアスするためです。テストの場合、unalias ls
と入力してからls
を試してください。無色になります。
出典: Renan 's answer to 「dir」と「ls」の違いは何ですか ?
疑わしい場合は、type ls
とtype dir
を比較してください( lsと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
が最も見やすく、システムが異なる場合があります。
短い答え:なし、dir
は、デフォルトでls
、ls
バイナリが--color
を持つソースコードと同じソースコードです。 (1行のコード差分)