我一直试图找到在终端中使用dir
和ls
命令之间的区别。我知道ls是查看目录中文件的传统UNIX方法,与dir
Windows命令提示符等效,但是这两个命令都在终端中工作。
如果键入,dir
则显示目录中的文件和文件夹,如果键入ls
,则执行相同的操作,但突出显示内容。这两个命令都接受选项(即ls -a
,dir -a
都返回所有文件和文件夹以及隐藏文件。
那么,有谁知道区别是什么,为什么要同时使用dir
和ls
?
我一直试图找到在终端中使用dir
和ls
命令之间的区别。我知道ls是查看目录中文件的传统UNIX方法,与dir
Windows命令提示符等效,但是这两个命令都在终端中工作。
如果键入,dir
则显示目录中的文件和文件夹,如果键入ls
,则执行相同的操作,但突出显示内容。这两个命令都接受选项(即ls -a
,dir -a
都返回所有文件和文件夹以及隐藏文件。
那么,有谁知道区别是什么,为什么要同时使用dir
和ls
?
Answers:
dir
和ls
是的一部分,coreutils
与dir
几乎相同ls
,只是具有不同的默认选项。
GNU Core实用程序是GNU操作系统的基本文件,shell和文本操作实用程序。这些是预期在每个操作系统上都存在的核心实用程序。
info dir
说:
dir
等价于ls -C -b
; 也就是说,默认情况下,文件在列中列出,并按垂直顺序排序,特殊字符由反斜杠转义序列表示。
哦,还有vdir
!info vdir
说:
vdir
等价于ls -l -b
; 也就是说,默认情况下,文件以长格式列出,特殊字符由反斜杠转义序列表示。
dir
由于向后兼容性或由于历史原因,很可能存在。
alias dir
以查看其实际内容。键入alias
以查看所有别名。
type dir
以查看其内容(别名,命令,bash函数...)
ls
和dir
ls
并且dir
是行为相似的独立程序。如以下所解释和参考的,的目的dir
是提供类似ls
其输出不会根据其是否去往终端而变化的命令。为了有帮助地实现此目的,dir
必须以合理且有用的方式格式化其输出,以便在终端中查看以及写入文件或管道。
关于以下两个常见的误解dir
:
dir
是的别名ls
,但事实并非如此。这两个命令都不是另一个的别名,并且在Ubuntu中默认情况下dir
根本不是一个别名。ls
并且dir
由单独的,不同的可执行文件提供。dir
存在是由于模糊的历史原因或与某些标准或某些其他OS的兼容性。也不是这样。ls
表现其兼容性的方式。 dir
,因为它不是标准的Unix命令,所以不必兼容,它以另一种方式起作用,即开发人员认为自己有价值,甚至可能更可取。ls
和dir
不同?双方ls
并dir
列出目录的内容。它们在默认行为上的两个特定区别将它们区分开。
当其标准输出为终端时,ls
在垂直排序的列(例如ls -C
)中列出文件名。如果其标准输出不是终端(例如file或pipe),则ls
每行列出一个文件名(如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
遇到控制字符或任何其他特殊字符(如果将它们输入到shell中都会被特殊解释)时,它都会为字符打印反斜杠序列。这甚至包括相对常见的字符,例如空格。例如,dir
将列出称为条目Documents backups
的Documents\ 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
而是。
怎么看ls
,dir
以及相关的vdir
工具都在没有不必要的代码重复的coreutils的源代码来实现,见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
(even ls -Cb
)获得彩色输出,但没有dir
呢?大多数Ubuntu用户都有一个别名,名称ls
为running ls --color=auto
。当ls
既作为别名又作为外部命令存在时,别名在简单的交互式命令中优先。
别名定义不会递归扩展-这是别名使用调用的外部ls
命令。有关别名如何工作的更多信息,请参见Bash参考手册中的6.6别名。ls
--color=auto
当传递给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
是(但不是dir
)。
dir
产生彩色输出?要启用彩色输出dir
,只需.bashrc
在您的主目录中进行编辑,然后#alias dir='dir --color=auto'
通过删除开头取消注释该行#
。在开始更改后的Shell中,dir
将是一个别名。
如果要在当前Shell中进行更改,则可以将别名定义作为命令.bashrc
运行,也可以通过运行来作为源. ~/.bashrc
。
可以说这有悖于主要观点,dir
即无论输出设备如何,它都应产生相同类型的输出。然而:
dir
别名很有用,则应该这样做。\dir
或覆盖别名command dir
,dir
仍将生成与设备无关的输出。这是说,混叠dir
到dir --color=auto
不真正打破dir
。我倾向于认为那
dir
只是为了向后兼容。dir等效于ls -C -b; 也就是说,默认情况下,文件在列中列出,并按垂直顺序排序,特殊字符由反斜杠转义序列表示。
顺便说一句,
ls
默认情况下不会为输出着色:这是因为大多数发行版别名ls
为ls --color=auto
in/etc/profile.d
。要进行测试,请输入,unalias ls
然后尝试ls
:它将是无色的。
来源:雷南的回答到什么是‘目录’和‘LS’的区别?
dir
是不提供向后兼容性 -并且ls
居然是 -这答案(和它引用的回答)不正确状态下,两个命令之间的差异的技术,以及解释通常观察到的着色差异。所以+1。
如有疑问,请比较type ls
vs 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行代码差异)
dir
是不是的别名ls
。它们是独立的二进制文件,/usr/bin
它们的行为不同,如Rinzwind的答案所述。您可以使用别名来实现,但这不是实现方式。在使用GNU Coreutils的所有系统上都会出现分隔符dir
和ls
二进制文件。如果需要证明,请运行。cmp /bin/ls /bin/dir
alias
,现在为dir编译了一个新的二进制文件。您可以使用来下载其代码git clone git://git.sv.gnu.org/coreutils
。ls-dir.c中只更改了一行代码,它是:int ls_mode = LS_MULTI_COL;
。从技术上讲不是别名,但实际上是LS,但具有不同的默认选项(1行代码)。
dir
是ls
但具有不同的默认选项。dir
并且ls
在使用GNU Coreutils的分布一直是独立的二进制文件。一些发行版可能已经定义,也可能已经定义了一个别名dir
(定义与现有命令同名的别名是很常见的)。但是它们是单独的可执行文件。区分shell别名(根本不是文件)和具有相似源代码的单独可执行文件,并不是一种琐的区分。说这dir
是ls
Ubuntu中的别名既错误又令人误解。
alias
那么当然不是别名。
dir --color
;)