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

Bre*_*etD 83 command-line directory ls coreutils

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

如果我输入dir,它会显示目录中的文件和文件夹,如果我输入ls,它会做同样的事情,除了突出显示内容。这两个命令都接受选项(即ls -adir -a都返回所有文件和文件夹以及隐藏文件。

那么有谁知道有什么区别以及为什么都使用dirls

Rin*_*ind 77

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

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

info dir 说:

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

哦,还有vdirinfo vdir说:

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

很可能dir是由于向后兼容或由于历史原因而存在的。

  • 输入 `alias dir` 看看它到底是什么。输入 `alias` 以查看所有别名。 (4认同)
  • @user606723,'alias dir' 没有在 11.10 中显示(至少对我来说不是)。我相信“别名”只显示本地用户别名设置,而不是系统范围的。 (2认同)

Eli*_*gan 68

ls和之间的关系dir

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

有两种常见的误解dir

  • 许多人认为dir是 的别名ls,但事实并非如此。这两个命令都不是另一个的别名,默认情况下在 Ubuntu 中,dir根本不是别名。ls并且dir由单独的、不同的可执行文件提供。
  • 许多人认为dir存在的历史原因不明,或者提供与某些标准或某些其他操作系统的兼容性。情况也并非如此。ls其行为方式与兼容性相同。 dir,它不必兼容,因为它不是标准的 Unix 命令,它以另一种方式运行,开发人员认为它本身很有价值,甚至可能更可取。

好的,但究竟如何lsdir不同?

双方lsdir列出目录的内容。它们默认行为的两个特定差异使它们与众不同。

  1. 当它的标准输出是终端时,ls在垂直排序的列中列出文件名(如ls -C)。当其标准输出不是终端(例如,文件或管道)时,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 backupsas的条目Documents\ backups。这就像ls -b.

    对于lsdir,这些默认值可能会被GNU coreutils 参考手册10.1.7 格式化文件名中列出的标志覆盖。这包括、、和其他一些。-b-q--quoting-style=

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

为什么有dir

单独dir实用程序的基本原理在GNU 编码标准的4.5通用接口标准中给出。我建议阅读整个部分以了解开发人员的推理,但以下是适用于ls/的重点dir

请不要让实用程序的行为取决于用于调用它的名称......

相反,使用运行时选项或编译开关或两者来选择替代行为......

同样,请不要让命令行程序的行为取决于输出设备的类型......

兼容性要求某些程序取决于输出设备的类型。如果lssh不以所有用户期望的方式这样做,那将是灾难性的。在其中一些情况下,我们会使用不依赖于输出设备类型的首选替代版本来补充程序。例如,我们提供了一个dir非常类似的程序, ls只是它的默认输出格式始终是多列格式。

GNU 项目认为,从技术角度来看,实用程序根据写入的设备类型(至少在实用程序的默认配置中)产生不同的输出是不可取的。对于某些实用程序,包括ls,依赖于设备的输出是兼容性所必需的,因此它以用户期望的方式工作。一些用户也特别喜欢这种依赖于设备的行为。

虽然ls不能合理地编写为独立运行设备,但dir创建了一个单独的实用程序来实现这一点。因此dir,由于历史兼容性的原因而行为异常的实用程序不是 -ls.

怎么看lsdir以及相关的vdir工具都在的coreutils源代码,而无需不必要的重复代码来实现,见ls-dir.cls-ls.cls-vdir.cls.h,和ls.c

是否dir真的有用吗?

如果您曾经希望ls生成多列输出,即使您将其通过管道传输到less( ls | less) 或将其重定向到文件 ( ls > out.txt),您可以使用dirls -C

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

dir等价于ls -Cb,所以在这个意义上你不需要dir. 但dir提供了在实践中通常有用的选项组合(尽管并不广为人知)。

为什么我从ls(甚至ls -Cb)获得彩色输出但不是dir?!

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

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

当传递给ls, dir, or 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
Run Code Online (Sandbox Code Playgroud)

您会注意到ls别名 ( alias ls='ls --color=auto') 没有被注释,而那些 fordirvdir被注释掉,#因此它们不起作用。也就是说,whiledir不是别名,lsis (但不是 to dir)

我也如何dir制作彩色输出?

要使用 启用彩色输出dir,只需.bashrc在您的主目录中进行编辑并#alias dir='dir --color=auto'通过删除前导#. 在shell启动后改了,dir会是一个别名。

如果您希望在当前 shell 中进行更改,您可以将别名定义作为命令.bashrc运行,或者您可以通过运行. ~/.bashrc.

这可以说与主要观点dir背道而驰——无论输出设备如何,它都应该产生相同类型的输出。然而:

  • 如果您发现创建此dir别名很有用,那么您当然应该这样做。
  • 当作为外部命令调用时,例如在脚本中,或者如果您通过运行\dir或覆盖别名command dirdir仍将产生与设备无关的输出。这就是说,别名dirtodir --color=auto并没有真正中断dir


小智 5

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

来自GNU Coreutils

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

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

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