![命令 CD 起什么作用?](https://linux22.com/image/1221929/%E5%91%BD%E4%BB%A4%20CD%20%E8%B5%B7%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我没有意识到我打开了大写锁定键,而是CD
在 Mac 的命令提示符中输入了内容。令人惊讶的是,它没有出错。
which CD
显示/usr/bin/CD
。如果我检查该文件,它看起来是这样的:
#!/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+"$@"}
我猜这与将大写字母转换为小写字母有关,但${0##*/}
对我来说完全不透明。 man CD
告诉我“无需手动输入”。有人可以解释一下这个命令吗?
编辑:好的,我刚刚注意到 OSX 的文件系统不区分大小写,因此此文件实际上是/usr/bin/cd
。但是如果我cd
正常输入,我当然会得到内置函数,因此/usr/bin/cd
只有当我输入错误时才会调用它。我仍然想知道它的作用。
答案1
看起来它根本没起什么作用:
“我在这里回忆一些旧事,所以我无法提供非常详细的解释,但 /usr/bin/cd 存在的原因是由于与别名相关的 POSIX 要求,并且能够不通过转义使用别名。但 /usr/bin/cd 是一个无用的脚本,因为如果您在 shell 脚本中运行 cd,目录更改仅适用于脚本运行的子 shell。cd 不能是 shell 脚本。
此外,该脚本是一个通用脚本,因为它可用于许多命令,而不仅仅是 cd。
我注意到
/usr/bin/cd
我的 10.4 系统上的硬链接数为 15 [...]”
在该主题的后面部分:
“我的一个朋友告诉我“${0##*/}”的意思是“接受命令,但删除其路径”(即将“/usr/bin/cd”转换为“cd”)。”
因此,脚本似乎删除了路径,将结果转换为小写,然后附加原始参数。
答案2
它试图做正确的事情,将你的“cd”命令转换为小写。遗憾的是,这毫无意义,因为它在子 shell 中运行。剩下的就是理解 bash。