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
吗?dir
和ls
是coreutils
的一部分,dir
与ls
几乎相同,只是具有不同的默认选项。
GNU核心工具是GNU操作系统的基本文件、Shell和文本处理工具。这些是期望存在于每个操作系统上的核心工具。
info dir
说:
dir
等同于ls -C -b
;也就是说,默认情况下文件以列形式垂直排序,并且特殊字符以反斜杠转义序列表示。
哦,还有vdir
!info vdir
说:
vdir
等同于ls -l -b
;也就是说,默认情况下文件以长格式显示,并且特殊字符以反斜杠转义序列表示。
很可能dir
存在是为了向后兼容或由于历史原因。
alias dir
查看它的实际内容。输入alias
查看所有别名。 - user606723type dir
查看它是什么(别名、命令、bash函数...) - ychaouchels
和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调用和dir调用, 在GNU coreutils参考手册中。
dir
?关于单独使用dir
的理由在4.5 接口标准的GNU编码标准中有详细说明。我建议阅读整个章节以了解开发者的推理,但以下是与ls
/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
的别名,它运行ls --color=auto
。当ls
既作为别名又作为外部命令存在时,在简单的交互命令中,别名优先。--color=auto
调用ls
别名的外部ls
命令。有关别名工作原理的更多信息,请参阅6.6 Aliases在Bash参考手册中。ls
、dir
或vdir
(以及一些其他命令,如grep
)时,--color=auto
只在输出到终端时使用颜色,否则不使用。~/.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
命令。ls
之所以采取这样的行为是为了与其他发行版兼容,但不仅仅是出于历史原因;许多当前用户发现根据写入设备的不同来改变ls
的输出,并继续在脚本中解析ls
的输出很有用,尽管许多程序员认为那是不好的做法。 - SpinUp __ A Davisdir
只是为了向后兼容而存在。顺便说一下,默认情况下dir等同于ls -C -b;也就是说,默认情况下,文件以列的形式垂直排序,并且特殊字符由反斜杠转义序列表示。
ls
不会给输出着色:这是因为大多数发行版在/etc/profile.d
中将ls
别名为ls --color=auto
。测试一下,输入unalias ls
然后尝试使用ls
:它将没有颜色。dir
不提供向后兼容性,而ls
实际上是。这个答案(以及它引用的答案)确实正确陈述了这两个命令的技术差异,并解释了常见的着色差异。所以+1。 - Eliah Kagandir
是与 ls
相同的源代码,ls
二进制文件默认具有 --color
功能。(1 行代码差异)dir
不是 ls
的别名。它们是在 /usr/bin
中表现不同的独立二进制文件,正如 Rinzwind 的 答案 中所描述的那样。你可以通过别名来实现此操作,但这 不是 它的实现方式。所有使用 GNU Coreutils 的系统都会出现单独的 dir
和 ls
二进制文件。如果你需要证明,请运行 cmp /bin/ls /bin/dir
。 - Eliah Kaganalias
就可以在别名列表中看到它。现在为dir编译了一个新的二进制文件。你可以使用以下命令下载其代码:git clone git://git.sv.gnu.org/coreutils
。
在ls-dir.c中只修改了一行代码:int ls_mode = LS_MULTI_COL;
。从技术上讲,它不是一个别名,但实际上它是带有不同默认选项的LS(只是一行代码)。 - Paco Valdezdir
是ls
,但默认选项不同。在使用GNU Coreutils的发行版中,dir
和ls
一直是独立的二进制文件。一些发行版可能也定义了一个名为dir
的别名(定义与现有命令同名的别名很常见)。但它们是独立的可执行文件。区分shell别名(根本不是一个文件)和具有类似源代码的独立可执行文件,并不是一种迂腐的区别。在Ubuntu中说dir
是ls
的别名既错误又误导。 - Eliah Kaganalias
中列出的任何内容,那当然不是别名。 - Paco Valdeztype 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
是最明显的,你的系统可能会有所不同。