Bash 什么是'Cd'命令?
我在写一些代码,像往常一样通过命令行导航我的计算机(OSX 10.11.6),然后我输入了一个错误!代替键入:Bash 什么是'Cd'命令?,bash,macos,freebsd,Bash,Macos,Freebsd,我在写一些代码,像往常一样通过命令行导航我的计算机(OSX 10.11.6),然后我输入了一个错误!代替键入: cd USB 我打字 Cd USB 没有发生任何事情,但它没有注册为无效命令。对此感到困惑,我做了一些调查:我检查了man条目。没有人进入。我使用哪个Cd,找到了源文件(/usr/bin/Cd),然后cat编辑了它: #!/bin/sh # $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperci
cd USB
我打字
Cd USB
没有发生任何事情,但它没有注册为无效命令。对此感到困惑,我做了一些调查:我检查了man
条目。没有人进入。我使用哪个Cd
,找到了源文件(/usr/bin/Cd
),然后cat
编辑了它:
#!/bin/sh
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $
# This file is in the public domain.
builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"}
这是什么,为什么在这里?它与freeBSD有什么关系
任何帮助都将是惊人的,谢谢 默认情况下,macOS使用不区分大小写的文件系统
,有时可能会产生误导:
在返回(有效)相同的文件路径方面,哪张Cd
与哪张Cd
和哪张Cd
实际上是相同的
令人困惑的是,尽管所有3个命令都引用同一个文件,但它们是以保留大小写的方式这样做的,误导性地暗示文件名的实际大小写是您指定的
作为一种解决方法,如果使用globbing(文件名扩展),您可以看到文件名的真实情况:
Bash(macOS默认shell)在内部区分大小写。 也就是说,它将
cd
识别为内置的cd
(其内置的目录更改命令)
相比之下,由于大小写的不同,它不会将Cd
识别为
如果它不将Cd
识别为内置的,那么它会寻找一个外部实用程序(在$PATH
中),这就是它找到/usr/bin/Cd
的时候
/usr/bin/cd
被实现为shell脚本,它基本上是无用的,因为作为一个外部实用程序,它不能影响shell的状态,因此它更改目录的尝试被简单地忽略。(在注释中指出,您可以将其用作测试给定目录是否可以更改为,因为脚本的退出代码将反映这一点) 提供在FreeBSD和OSX(主要基于FreeBSD)中包含脚本的历史记录,但值得深入了解其基本原理(重点): 从: 但是,所有标准实用程序,包括表中的常规内置程序,但不包括特殊内置实用程序中描述的特殊内置程序,的实现方式应确保可通过POSIX.1-2008系统接口卷中定义的exec函数系列访问它们,并可由需要的标准实用程序(env、find、nice、nohup、time、xargs)直接调用 本质上,上面的意思是:常规内置必须(也)可以独立调用,作为可执行文件(无论是脚本还是二进制文件),就像shell中的内置一样 引用的常规内置表包含以下实用程序:
alias bg cd命令false fc fg getopts jobs kill newgrp pwd read true umask unalias wait
注意:根据定义,特殊的内置实用程序只是shell内部的,它们的行为不同于常规的内置实用程序
因此,要正式兼容POSIX,操作系统必须确实提供cd
作为外部实用工具
与此同时,POSIX规范确实意识到,至少有一些常规内置组件(尤其是cd
)仅作为内置组件才有意义:
“由于cd
影响当前的shell执行环境,因此始终作为shell常规内置提供。”-
在列出的常规内置实用程序中,有些作为内置实用程序和外部实用程序都是有意义的:
例如,kill
需要是一个内置的,以便终止作业(这是一个shell内部概念),但它也可用作一个外部实用程序,以便通过PID终止进程
然而,在列出的常规内置实用程序中,以下这些外部实用程序是毫无意义的,据我所知,如果您不同意,请告诉我
,即使POSIX要求他们到场:
alias bg cd命令fc fg getopts作业读取umask unalias
为帮助完成列表,向您提供提示;他还指出,内置的hash
即使不是POSIX实用程序,也有一个无意义的脚本实现
[1] 正如在一篇评论中指出的,可以以区分大小写的方式格式化macOS文件系统HFS+(尽管大多数人坚持不区分大小写的默认设置)。基于,以下命令将告诉您macOS文件系统是否不区分大小写:
diskutil info/|grep-iq'^\s*Name.*区分大小写*&&echo“区分大小写”| echo“不区分大小写”
我记得,MacOS默认使用不区分大小写的文件系统。您看到的/usr/bin/Cd
命令实际上是/usr/bin/Cd
,但它可以通过任何名称引用
您可以通过键入
ls /usr/bin/ | grep -i cd
通常,cd
是shell中的内置命令。如您所知,它会更改当前目录。外部cd
命令几乎没有用处,但它仍然存在
它可以用来检测是否可以在不影响当前进程的工作目录的情况下更改到指定目录
您的shell(可能是bash)倾向于采用区分大小写的命令名。内置命令只能称为cd
,但由于它能够打开名为/usr/bin/cd
的脚本文件,因此它可以找到并执行它。这是什么?
脚本本身是一种转换命令的可移植方式,即使使用随机上限casi也是如此
ls /usr/bin/ | grep -i cd