当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

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

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

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

最佳解决思路

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

The GNU Core Utilities are the basic file, shell and text manipulation utilities of the GNU operating system. These are the core utilities which are expected to exist on every operating system.

info dir说:

dir is equivalent to ls -C -b; that is, by default files are listed in columns, sorted vertically, and special characters are represented by backslash escape sequences.

哦,还有vdirinfo vdir说:

vdir is equivalent to ls -l -b; that is, by default files are listed in long format and special characters are represented by backslash escape sequences.

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

次佳解决思路

lsdir的关系

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

关于dir有两种常见的误解:

  • 许多人认为dirls的别名,但事实并非如此。这两个命令都不是另一个的别名,默认情况下,在Ubuntu中,dir根本不是别名。 lsdir由单独的non-identical可执行文件提供。

  • 许多人认为dir存在的原因不明,或者提供与某些标准或其他操作系统的兼容性。事实并非如此。 ls的行为方式与兼容性相同。 dir不必兼容,因为它不是标准的Unix命令,它的行为方式是开发人员认为有价值的,甚至可能更好。

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

lsdir都列出了目录的内容。它们的默认行为的两个具体差异区分它们。

  1. 当其standard output是终端时,ls列出垂直排序列中的文件名(如ls -C)。当其标准输出不是终端(例如,文件或pipe)时,ls每行列出一个文件名(如ls -1)。无论其标准输出是否为终端,dir都会在垂直排序的列中列出文件名(如ls -C)。对于lsdir,这些默认值可以被--format=标记和-1-C-m-x标记覆盖,这些标记缩写特定的--format=选项。有关详细信息,请参阅GNU coreutils reference manual中的10.1.4 General output formatting

  2. 当其标准输出是终端并且要列出的文件名包含control characters时,ls打印?而不是每个控制字符(如ls -q)。当其标准输出不是终端时,ls打印控制字符as-is(如ls --show-control-chars)。无论其标准输出是否为终端,当dir遇到控制字符或任何其他将在进入shell时特别解释的字符时,它会打印字符的反斜杠序列。这包括甚至比较常见的字符,如空格。例如,dir将列出名为Documents backups的条目为Documents\ backups。这就像ls -b。对于lsdir,这些默认值可能会被GNU coreutils reference manual10.1.7 Formatting the file names中列出的标志覆盖。这包括-b-q--quoting-style=等。

来源:ls invocationdir invocation,在GNU coreutils reference manual中。

为什么选择dir

单独的dir实用程序的基本原理在GNU coding standards4.5 Standards for Interfaces Generally中给出。我建议阅读整个部分以了解开发人员的推理,但以下是适用于ls /dir的要点:

Please don’t make the behavior of a utility depend on the name used to invoke it….

Instead, use a run time option or a compilation switch or both to select among the alternate behaviors….

Likewise, please don’t make the behavior of a command-line program depend on the type of output device….

Compatibility requires certain programs to depend on the type of output device. It would be disastrous if ls or sh did not do so in the way all users expect. In some of these cases, we supplement the program with a preferred alternate version that does not depend on the output device type. For example, we provide a dir program much like ls except that its default output format is always multi-column format.

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

虽然ls无法合理地编写为独立运行设备,但创建了一个单独的dir实用程序来实现此目的。因此,dir不是出于历史兼容性而奇怪的行为–ls

要查看lsdir和相关的vdir实用程序如何在coreutils源代码中实现而不需要不必要的代码重复,请参阅ls-dir.cls-ls.cls-vdir.cls.hls.c

dir真的有用吗?

如果您曾希望ls产生multi-column输出,即使您将其输出到less(ls | less)或将其重定向到文件(ls > out.txt),您也可以使用dirls -C

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

dir相当于ls -Cb,因此从这个意义上讲,您不需要dir。但是dir提供了一些选项组合,这些选项在实践中通常很有用(尽管并不广为人知)。

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

大多数Ubuntu用户都有一个名为ls的别名,它运行ls --color=auto。当ls同时作为别名和外部命令存在时,别名优先于简单的交互式命令。

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

传递给lsdirvdir(以及其他一些命令,如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别名很有用,那么您当然应该这样做。

  • 当作为外部命令调用时,例如在脚本中或通过运行\dircommand dir覆盖别名时,dir仍将产生device-independent输出。这就是说,将dir别名化为dir --color=auto并不会真正破坏dir

第三种解决思路

I would be inclined to think that dir is there just ‘dir’和’ls’终端命令之间的区别?.

From GNU Coreutils:

dir is equivalent to ls -C -b; that is, by default files are listed in columns, sorted vertically, and special characters are represented by backslash escape sequences.

By the way, ls doesn’t colorize the output by default: this is because most distros alias ls to ls --color=auto in /etc/profile.d. For a test, type unalias ls then try ls: it will be colorless.

来源:RenananswerWhat’s the difference between “dir” and “ls”

第四种思路

简答:无,dirls的别名,正如@Rinzwind所说,ls默认有--color

第五种思路

如有疑问,请比较type lstype dir(另请参阅Difference between ls and 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将是最明显的,您的系统可能会有所不同。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1171.html,未经允许,请勿转载。