问题描述
我一直试图找到在终端中使用dir
和ls
命令之间的区别。我知道ls是查看目录中文件的传统UNIX方法,而dir
是等效的Windows命令提示符,但这两个命令都在终端中工作。
如果我键入dir
,它会显示目录中的文件和文件夹,如果我键入ls
,它会执行相同的操作,但内容突出显示除外。两个命令都接受选项(即ls -a
和dir -a
都返回所有文件和文件夹以及隐藏文件。
那么有谁知道有什么区别以及为什么使用dir
和ls
?
最佳解决思路
dir
和ls
是coreutils
的一部分,dir
与ls
几乎相同,只是具有不同的默认选项。
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 tols -C -b
; that is, by default files are listed in columns, sorted vertically, and special characters are represented by backslash escape sequences.
哦,还有vdir
! info vdir
说:
vdir
is equivalent tols -l -b
; that is, by default files are listed in long format and special characters are represented by backslash escape sequences.
最有可能的dir
是为了向后兼容或由于历史原因而存在。
次佳解决思路
ls
与dir
的关系
ls
和dir
是行为相似的独立程序。如下面所解释和引用的那样,dir
的目的是提供像ls
这样的命令,其输出不会根据它是否到达终端而变化。为了实现这一目标,dir
必须以合理且有用的方式格式化其输出,以便在终端中查看和写入文件或管道。
关于dir
有两种常见的误解:
-
许多人认为
dir
是ls
的别名,但事实并非如此。这两个命令都不是另一个的别名,默认情况下,在Ubuntu中,dir
根本不是别名。ls
和dir
由单独的non-identical可执行文件提供。 -
许多人认为
dir
存在的原因不明,或者提供与某些标准或其他操作系统的兼容性。事实并非如此。ls
的行为方式与兼容性相同。dir
不必兼容,因为它不是标准的Unix命令,它的行为方式是开发人员认为有价值的,甚至可能更好。
好的,但ls
和dir
究竟有何不同?
ls
和dir
都列出了目录的内容。它们的默认行为的两个具体差异区分它们。
-
当其standard output是终端时,
ls
列出垂直排序列中的文件名(如ls -C
)。当其标准输出不是终端(例如,文件或pipe)时,ls
每行列出一个文件名(如ls -1
)。无论其标准输出是否为终端,dir
都会在垂直排序的列中列出文件名(如ls -C
)。对于ls
和dir
,这些默认值可以被--format=
标记和-1
,-C
,-m
和-x
标记覆盖,这些标记缩写特定的--format=
选项。有关详细信息,请参阅GNU coreutils reference manual中的10.1.4 General output formatting。 -
当其标准输出是终端并且要列出的文件名包含control characters时,
ls
打印?
而不是每个控制字符(如ls -q
)。当其标准输出不是终端时,ls
打印控制字符as-is(如ls --show-control-chars
)。无论其标准输出是否为终端,当dir
遇到控制字符或任何其他将在进入shell时特别解释的字符时,它会打印字符的反斜杠序列。这包括甚至比较常见的字符,如空格。例如,dir
将列出名为Documents backups
的条目为Documents\ backups
。这就像ls -b
。对于ls
和dir
,这些默认值可能会被GNU coreutils reference manual中10.1.7 Formatting the file names中列出的标志覆盖。这包括-b
,-q
,--quoting-style=
等。
来源:ls invocation和dir invocation,在GNU coreutils reference manual中。
为什么选择dir
?
单独的dir
实用程序的基本原理在GNU coding standards的4.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
orsh
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 adir
program much likels
except that its default output format is always multi-column format.
GNU项目认为,从技术角度来看,实用程序根据它所写入的设备类型(至少在实用程序的默认配置中)产生不同的输出是不可取的。对于某些实用程序,包括ls
,device-dependent输出是兼容性所必需的,因此它的工作方式与用户期望的一样。有些用户也特别喜欢这种device-dependent行为。
虽然ls
无法合理地编写为独立运行设备,但创建了一个单独的dir
实用程序来实现此目的。因此,dir
不是出于历史兼容性而奇怪的行为–ls
。
要查看ls
,dir
和相关的vdir
实用程序如何在coreutils源代码中实现而不需要不必要的代码重复,请参阅ls-dir.c
,ls-ls.c
,ls-vdir.c
,ls.h
和ls.c
。
dir
真的有用吗?
如果您曾希望ls
产生multi-column输出,即使您将其输出到less
(ls | less
)或将其重定向到文件(ls > out.txt
),您也可以使用dir
或ls -C
。
如果您曾希望可以直接复制ls
显示的文件名并将其用作命令的一部分而不必担心引用,则可以使用dir
或ls -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。
传递给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
仍将产生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 aliasls
tols --color=auto
in/etc/profile.d
. For a test, typeunalias ls
then tryls
: it will be colorless.
来源:Renan的answer到What’s the difference between “dir” and “ls”?
第四种思路
简答:无,dir
是ls
的别名,正如@Rinzwind所说,ls
默认有--color
第五种思路
如有疑问,请比较type ls
与type 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
将是最明显的,您的系统可能会有所不同。
参考资料