'dir'和'ls'终端命令之间的区别?


74

我一直试图找到在终端中使用dirls命令之间的区别。我知道ls是查看目录中文件的传统UNIX方法,与dirWindows命令提示符等效,但是这两个命令都在终端中工作。

如果键入,dir则显示目录中的文件和文件夹,如果键入ls,则执行相同的操作,但突出显示内容。这两个命令都接受选项(即ls -adir -a都返回所有文件和文件夹以及隐藏文件。

那么,有谁知道区别是什么,为什么要同时使用dirls


7
dir --color;)
Rinzwind 2012年

3
只是想对这个问题收到的回复感到惊讶。我想我不是唯一对此感到疑惑的人:)
BretD 2012年

3
来自远古时代的命令总是将年长的书呆子拖出木制品;)
Rinzwind 2012年

Answers:


70

dirls是的一部分,coreutilsdir几乎相同ls,只是具有不同的默认选项。

GNU Core实用程序是GNU操作系统的基本文件,shell和文本操作实用程序。这些是预期在每个操作系统上都存在的核心实用程序。

info dir 说:

dir等价于ls -C -b; 也就是说,默认情况下,文件在列中列出,并按垂直顺序排序,特殊字符由反斜杠转义序列表示。

哦,还有vdirinfo vdir说:

vdir等价于ls -l -b; 也就是说,默认情况下,文件以长格式列出,特殊字符由反斜杠转义序列表示。

dir由于向后兼容性或由于历史原因,很可能存在。


我以为这可能只是其他人的别名。我以为这样做是为了让Windows用户感到更自在,哈哈。谢谢您的彻底回答!
BretD

4
输入alias dir以查看其实际内容。键入alias以查看所有别名。
user606723 '02

2
@ user606723,“别名目录”未在11.10中显示(至少对我而言不是)。我相信“别名”仅显示本地用户别名设置,而不显示整个系统。
詹姆斯

键入type dir以查看其内容(别名,命令,bash函数...)
ychaouche

49

之间的关系lsdir

ls并且dir是行为相似的独立程序。如以下所解释和参考的,的目的dir是提供类似ls其输出不会根据其是否去往终端而变化的命令。为了有帮助地实现此目的,dir必须以合理且有用的方式格式化其输出,以便在终端中查看以及写入文件或管道。

关于以下两个常见的误解dir

  • 许多人认为dir是的别名ls,但事实并非如此。这两个命令都不是另一个的别名,并且在Ubuntu中默认情况下dir根本不是一个别名。ls并且dir由单独的,不同的可执行文件提供。
  • 许多人认为dir存在是由于模糊的历史原因或与某些标准或某些其他OS的兼容性。也不是这样。ls表现其兼容性的方式。 dir,因为它不是标准的Unix命令,所以不必兼容,它以另一种方式起作用,即开发人员认为自己有价值,甚至可能更可取。

OK,但究竟如何lsdir不同?

双方lsdir列出目录的内容。它们在默认行为上的两个特定区别将它们区分开。

  1. 当其标准输出为终端时,ls在垂直排序的列(例如ls -C)中列出文件名。如果其标准输出不是终端(例如file或pipe),则ls每行列出一个文件名(如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遇到控制字符或任何其他特殊字符(如果将它们输入到shell中都会被特殊解释)时,它都会为字符打印反斜杠序列。这甚至包括相对常见的字符,例如空格。例如,dir将列出称为条目Documents backupsDocuments\ backups。这就像ls -b

    对于ls和而言dir,这些默认值都可以被GNU coreutils参考手册中的10.1.7格式化文件名中列出的标志所覆盖。这包括,,,和其他一些人。-b-q--quoting-style=

来源GNU coreutils参考手册中的ls调用dir调用

为什么要dir呢?

对单独的理由dir实用中给出4.5标准接口通常GNU编码标准。我建议阅读整个部分以了解开发人员的推理,但是这里是适用于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)时都希望产生多列输出,则可以使用dirls -C

如果您曾经希望直接复制显示的文件名ls并将其用作命令的一部分而不必担心引用,则可以使用dirls -b

dir等价于此ls -Cb,因此从某种意义上讲您不需要dir。但是dir提供了在实践中通常有用的选项组合(尽管尚未广为人知)。

为什么我从ls(even ls -Cb)获得彩色输出,但没有dir呢?

大多数Ubuntu用户都有一个别名,名称ls为running ls --color=auto。当ls既作为别名又作为外部命令存在时,别名在简单的交互式命令中优先。

别名定义不会递归扩展-这是别名使用调用的外部ls命令。有关别名如何工作的更多信息,请参见Bash参考手册中的6.6别名ls--color=auto

当传递给ls,,dirvdir(以及一些其他命令,如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')是取消注释,而那些dirvdir被注释掉与#所以他们没有影响。也就是说,虽然dir不是别名,ls(但不是dir

我如何也dir产生彩色输出?

要启用彩色输出dir,只需.bashrc在您的主目录中进行编辑,然后#alias dir='dir --color=auto'通过删除开头取消注释该行#。在开始更改后的Shell中,dir将是一个别名。

如果要在当前Shell中进行更改,则可以将别名定义作为命令.bashrc运行,也可以通过运行来作为源. ~/.bashrc

可以说这有悖于主要观点,dir即无论输出设备如何,它都应产生相同类型的输出。然而:

  • 如果您觉得创建该dir别名很有用,则应该这样做。
  • 当作为外部命令调用时,例如在脚本中,或者通过运行\dir或覆盖别名command dirdir仍将生成与设备无关的输出。这是说,混叠dirdir --color=auto不真正打破dir

质量答案,但可以使用ToC或TL; DR; :)
凯文(Kevin)

5

我倾向于认为那dir只是为了向后兼容

GNU Coreutils

dir等效于ls -C -b; 也就是说,默认情况下,文件在列中列出,并按垂直顺序排序,特殊字符由反斜杠转义序列表示。

顺便说一句,ls默认情况下不会为输出着色:这是因为大多数发行版别名lsls --color=autoin /etc/profile.d。要进行测试,请输入,unalias ls然后尝试ls:它将是无色的。

来源:雷南回答什么是‘目录’和‘LS’的区别


虽然dir提供向后兼容性 -并且ls居然 -这答案(和它引用的回答)不正确状态下,两个命令之间的差异的技术,以及解释通常观察到的着色差异。所以+1。
伊莱亚·卡根

3

如有疑问,请比较type lsvs 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看来,这是最明显的,您的系统可能有所不同。


2
这似乎根本不是默认的Ubuntu用户配置。我认为我使用过的任何Ubuntu系统都没有ls作为函数的别名_ls-甚至没有作为注释的行.bashrc。不过,看来(至少是某些版本的)openSuSE是默认的,但通过此对话该文件(从那里链接)以及我上次使用openSUSE的记忆(可能是错误的)来判断。
伊利亚·卡根

2
@EliahKagan:您猜对了,我正在使用OpenSuse!因此,正如我所说,结果会有所不同,但方法应该没问题。
user2394284

2

简短答案:无 。默认情况下,dir源代码与lsls二进制具有相同的源代码--color。(1行代码差异)


7
dir不是的别名ls。它们是独立的二进制文件,/usr/bin它们的行为不同,如Rinzwind答案所述。您可以使用别名来实现,但这不是实现方式。在使用GNU Coreutils的所有系统上都会出现分隔符dirls二进制文件。如果需要证明,请运行。cmp /bin/ls /bin/dir
伊利亚·卡根

2
一段时间以前,它是一个别名,您只需输入即可看到它在别名列表中列出alias,现在为dir编译了一个新的二进制文件。您可以使用来下载其代码git clone git://git.sv.gnu.org/coreutils。ls-dir.c中只更改了一行代码,它是:int ls_mode = LS_MULTI_COL;。从技术上讲不是别名,但实际上是LS,但具有不同的默认选项(1行代码)。
弗朗西斯科·瓦尔迪兹

1
是的,dirls但具有不同的默认选项dir并且ls在使用GNU Coreutils的分布一直是独立的二进制文件。一些发行版可能已经定义,可能已经定义了一个别名dir(定义与现有命令同名的别名是很常见的)。但是它们是单独的可执行文件。区分shell别名(根本不是文件)和具有相似源代码的单独可执行文件,并不是一种琐的区分。说这dirlsUbuntu中的别名既错误又令人误解。
伊利亚·卡根

是的,我同意你的观点,但是在这种情况下,源代码不是相似的,而是相同的源代码。如果我们说别名只是其中列出的任何东西,alias那么当然不是别名。
弗朗西斯科·瓦尔迪兹

3
它不是相同的源代码。如您所说,“源的一行已更改”。如果源是相同的,那么它仍然不是别名。类似于 Unix的系统中有很多东西都别名相似,但是它们会使新手(并激怒了经验丰富的用户)极大地混淆了别名的调用。符号链接,硬链接,相同文件,相似文件,包装脚本,隐藏可执行程序的shell内置文件以及同步文件(例如,使用UbuntuOne)在很大程度上都类似于别名,但它们不是别名。
伊利亚·卡根
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.