我一直在尝试找出在终端中使用dir
和ls
命令之间的区别。我知道ls
这是查看目录中文件的传统 UNIX 方法,并且与dir
Windows 命令提示符等效,但这两个命令都可以在终端中使用。
如果我输入dir
,它会显示目录中的文件和文件夹,如果我输入ls
,它会执行相同的操作,但内容会突出显示。这两个命令都接受选项(即ls -a
和dir -a
都返回所有文件和文件夹以及隐藏文件。
那么有人知道它们之间有什么区别以及为什么两者都dir
使用ls
吗?
答案1
dir
并且ls
是coreutils
和dir
几乎与 相同ls
,只是默认选项不同。
GNU 核心实用程序是 GNU 操作系统的基本文件、shell 和文本操作实用程序。这些是每个操作系统都应有的核心实用程序。
info dir
说:
dir
相当于ls -C -b
;也就是说,默认情况下文件按列列出,垂直排序,特殊字符用反斜杠转义序列表示。
哦还有vdir
!info vdir
说:
vdir
相当于ls -l -b
;也就是说,默认情况下文件以长格式列出,特殊字符用反斜杠转义序列表示。
很可能dir
是为了向后兼容或者由于历史原因而存在。
答案2
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=
标志和-1
、-C
、-m
和-x
标志覆盖,这些标志会缩写特定--format=
选项。请参阅10.1.4 通用输出格式在里面GNU coreutils 参考手册了解详情。当其标准输出是终端并且要列出的文件名包含控制字符,
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 调用和目录调用, 在里面GNU coreutils 参考手册。
为什么有dir
?
单独使用实用程序的理由dir
如下4.5 一般接口标准的GNU 编码标准。我建议阅读整个部分以了解开发人员的理由,但以下是适用于ls
/ 的重点dir
:
请不要让实用程序的行为取决于调用它的名称....
相反,使用运行时选项或编译开关或两者来选择替代行为....
同样,请不要让命令行程序的行为取决于输出设备的类型....
兼容性要求某些程序依赖于输出设备的类型。如果不能按照所有用户期望的方式做到这一点,那将是灾难性的。在某些情况下,我们会为程序补充一个不依赖于输出设备类型的
ls
首选sh
替代版本。例如,我们提供一个dir
非常相似的程序ls
,只是它的默认输出格式始终是多列格式。
GNU 项目认为,从技术角度来看,实用程序根据写入的设备类型产生不同的输出是不可取的(至少在实用程序的默认配置中)。对于某些实用程序(包括),ls
设备相关输出对于兼容性来说是必要的,因此它按用户期望的方式工作。一些用户也特别喜欢这种设备相关行为。
虽然ls
无法合理地编写为独立于设备运行,但dir
创建了一个单独的实用程序来实现这一点。因此,dir
由于历史兼容性的原因,行为奇怪的实用程序并不是——ls
是。
要了解如何在 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
(even ls -Cb
) 获得彩色输出但却得不到dir
?!
大多数 Ubuntu 用户都有一个名为 的别名,ls
它运行ls --color=auto
。当ls
同时作为别名和外部命令存在时,别名在简单的交互式命令中优先。
别名定义不会递归扩展——别名调用ls
的是外部命令。请参阅ls
--color=auto
6.6 别名在里面Bash 参考手册有关别名如何工作的更多信息。
当传递给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
则被注释掉,#
因此它们不起作用。也就是说,whiledir
不是别名,ls
是(但不是dir
)。
我怎样才能使其dir
也产生彩色输出?
要使用 启用彩色输出,只需在您的主目录中dir
编辑并删除前导 来取消注释该行。在更改后启动的 shell 中,将是一个别名。.bashrc
#alias dir='dir --color=auto'
#
dir
如果想要在当前 shell 中进行更改,可以将别名定义作为命令运行,或者可以.bashrc
通过运行来获取源. ~/.bashrc
。
这可能违背了主要观点dir
——无论使用什么输出设备,它都应该产生相同类型的输出。然而:
- 如果您发现创建这个
dir
别名很有用,那么您当然应该这样做。 - 当作为外部命令调用时(例如在脚本中,或者通过运行 或 覆盖别名
\dir
)command dir
,dir
仍将产生与设备无关的输出。也就是说,将 别名dir
为dir --color=auto
并不会真正破坏dir
。
答案3
我倾向于
dir
认为为了向后兼容。dir 相当于 ls -C -b;也就是说,默认情况下文件按列列出,垂直排序,特殊字符用反斜杠转义序列表示。
顺便说一句,
ls
默认情况下不会对输出进行着色:这是因为大多数发行版都将其别名ls
为ls --color=auto
in/etc/profile.d
。要进行测试,请键入unalias ls
然后尝试ls
:它将是无色的。
来源:雷南的回答到“dir” 和 “ls” 有什么区别?
答案4
如有疑问,请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
是最明显的,您的系统可能会有所不同。