‘dir’和’ls’终端命令之间的区别?
我一直试图找到在终端中使用dir
和ls
命令之间的区别。 我知道ls是查看目录中文件的传统UNIX方法,而dir
是等效的windows命令提示符,但这两个命令都在终端中工作。
如果我输入dir
它会显示dir
的文件和文件夹,如果我输入ls
它会执行相同的操作,但内容突出显示除外。 两个命令都接受选项(即ls -a
和dir -a
都返回所有文件和文件夹以及隐藏文件。
那么有谁知道差异是什么以及为什么使用dir
和ls
?
dir
和ls
是coreutils
一部分, dir
与ls
几乎相同,只是使用不同的默认选项。
GNU Core Utilities是GNU操作系统的基本文件,shell和文本操作实用程序。 这些是预期存在于每个操作系统上的核心实用程序。
info dir
说:
dir
相当于ls -C -b
; 也就是说,默认情况下,文件列在列中,垂直排序,特殊字符由反斜杠转义序列表示。
哦,还有vdir
! info vdir
说:
vdir
相当于ls -l -b
; 也就是说,默认情况下,文件以长格式列出,特殊字符由反斜杠转义序列表示。
dir
很可能是为了向后兼容或由于历史原因而存在。
ls
和dir
之间的关系
ls
和dir
是表现相似的独立程序。 如下面所解释和引用的, dir
的目的是提供像ls
这样的命令,其输出不会根据它是否到达终端而变化 。 为了有效地实现这一点, dir
必须以一种合理且有用的方式格式化其输出,以便在终端中查看和写入文件或管道。
关于dir
有两种常见的误解:
- 许多人认为
dir
是ls
的别名,但事实并非如此。 这两个命令都不是另一个的别名,默认情况下,在Ubuntu中,dir
根本不是别名。ls
和dir
由单独的,不相同的可执行文件提供。 - 很多人认为
dir
存在的原因不明显,或者提供与某些标准或其他操作系统的兼容性。 事实并非如此。ls
行为方式与兼容性相同。dir
,它不必兼容,因为它不是标准的Unix命令,它的行为方式是开发人员认为有价值的,甚至可能更好。
好的,但是ls
和dir
究竟有什么不同?
ls
和dir
列出了目录的内容。 它们的默认行为的两个具体差异区分它们。
-
当其标准输出是终端时,
ls
列出垂直排序列中的文件名(如ls -C
)。 当其标准输出不是终端(例如,文件或管道 )时,ls
列出每行一个文件名(如ls -1
)。无论其标准输出是否为终端,
dir
在垂直排序的列中列出文件名(如ls -C
)。对于
ls
和dir
,这些默认值可以被--format=
flag和-1
,-C
,-m
和-x
标志覆盖,这些标志特别是--format=
options。 有关详细信息,请参阅GNU coreutils参考手册中的10.1.4常规输出格式 。 -
当它的标准输出是终端并且要列出的文件名包含控制字符时 ,
ls
打印?
而不是每个控制字符(如ls -q
)。 当其标准输出不是终端时,ls
按原样打印控制字符(如ls --show-control-chars
)。无论其标准输出是否为终端,当
dir
遇到控制字符或任何其他将在进入shell时特别解释的字符时,它会打印字符的反斜杠序列。 这包括甚至比较常见的字符,如空格。 例如,dir
将列出名为Documents backups
的条目作为Documents\ backups
。 这就像ls -b
。对于
ls
和dir
,这些默认值可能会被10.1.7格式化 GNU coreutils参考手册中 的文件名中列出的标志所覆盖。 这包括-b
,-q
,–--quoting-style=
和其他一些。
来源 : ls调用和dir调用 ,在GNU coreutils参考手册中 。
为什么有dir
?
单独的dir
实用程序的基本原理在4.5接口标准中给出, 一般是GNU编码标准 。 我建议阅读整个部分以了解开发人员的推理,但以下是适用于ls
/ dir
:
请不要使实用程序的行为取决于用于调用它的名称….
相反,使用运行时选项或编译开关或两者来选择备用行为….
同样,请不要使命令行程序的行为取决于输出设备的类型….
兼容性要求某些程序取决于输出设备的类型。 如果
ls
或sh
没有像所有用户所期望的那样这样做,那将是灾难性的。 在某些情况下,我们使用不依赖于输出设备类型的首选备用版本来补充程序。 例如,我们提供的dir
程序与ls
非常相似,只是它的默认输出格式始终是多列格式。
GNU项目认为,从技术角度来看,实用程序根据它所写入的设备类型(至少在实用程序的默认配置中)产生不同的输出是不可取的。 对于某些实用程序(包括ls
,依赖于设备的输出是兼容性所必需的,因此它的工作方式与用户期望的一样。 一些用户也特别喜欢这种依赖于设备的行为。
虽然无法合理地编写ls
来独立运行设备,但是创建了一个单独的dir
实用程序来实现此目的。 因此, dir
不是出于历史兼容性而行为奇怪的实用工具 – 这是 。
要查看如何在coreutils源代码中实现ls
, dir
和相关的vdir
实用程序而不需要不必要的代码重复,请参阅ls-dir.c
, ls-ls.c
, ls-vdir.c
, ls.h
和ls.c
。
dir
真的有用吗?
如果您曾经希望ls
产生多列输出,即使您将其传输到less
( ls | less
)或将其重定向到文件( ls > out.txt
),您也可以使用dir
或ls -C
。
如果您曾希望可以直接复制ls
显示的文件名并将其用作命令的一部分而不必担心引用 ,则可以使用dir
或ls -b
。
dir
相当于ls -Cb
,所以从这个意义上说你不需要dir
。 但是dir
提供了一些选项组合,这些选项在实践中通常很有用(尽管并不广为人知)。
为什么我从ls
(甚至是ls -Cb
)获得彩色输出但不是dir
ls -Cb
大多数Ubuntu用户都有一个名为ls
的别名,它运行ls --color=auto
。 当ls
同时作为别名和外部命令存在时,别名优先于简单的交互式命令。
别名定义不会递归扩展 – 它是ls
别名使用--color=auto
调用的外部ls
命令。 有关别名如何工作的更多信息,请参阅Bash参考手册中的6.6别名 。
当传递给ls
, dir
或vdir
(以及其他一些命令,如grep
)时, – color --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'
行。 在更改后启动的shell中, dir
将是别名。
如果要在当前shell中进行更改,可以将别名定义作为命令运行,也可以通过运行来源.bashrc
. ~/.bashrc
. ~/.bashrc
。
这可以说与dir
的主要观点相反 – 无论输出设备如何,它都应该产生相同类型的输出。 然而:
- 如果你觉得制作这个
dir
别名很有用,你当然应该这样做。 - 当作为外部命令调用时,例如在脚本中,或者如果通过运行
\dir
或command dir
覆盖别名,dir
仍将生成与设备无关的输出。 这就是说dir --color=auto
别名dir
并没有真正打破dir
。
我倾向于认为
dir
只是为了向后兼容 。来自GNU Coreutils :
dir相当于ls -C -b; 也就是说,默认情况下,文件列在列中,垂直排序,特殊字符由反斜杠转义序列表示。
顺便说一下,默认情况下
ls
不会对输出着色:这是因为大多数发行版别名ls
tols --color=auto
in/etc/profile.d
。 对于测试,键入unalias ls
然后尝试ls
:它将是无色的。
资料来源: Renan 回答 “dir”和“ls”之间有什么区别 ?
简答:没有, dir
是ls
的别名,正如@Rinzwind所说, ls
有--color
默认
如有疑问,请比较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
将是最明显的,您的系统可能会有所不同。