[英]Can someone explain the source of the `cd` shell command?
$ cat $(which 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+"$@"}
我的兴趣在于了解谁在致电cd后记录状态变化。 它在文件中吗?
这不是 cd
内置的,它实际上不起作用,除了告诉目录是否可以更改为目录(如果不能通过非零退出状态失败)之外。
试试吧:
"$(which cd)" /
...什么都不做。
实际的cd
内置程序是用C语言编写的外壳程序的一部分,并调用chdir()
syscall。 该系统调用将更新进程的状态(由内核跟踪)以具有不同的工作目录。
......那么,什么是 shell脚本的该块做什么? 让我们分解一下:
builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"}
...首先,我们echo
荷兰国际集团的命令本身(有点越野车的时尚,由于缺乏引号)到tr
,并将其更改为全小写,这样,如果它正在通过硬连接称为命名CD
,它将仍然映射到名为cd
的内置文件。
...第二, 如果有任何参数( ${foo+bar}
仅在定义了foo
情况下扩展为bar
), ${1+"$@"}
将传递所有参数( "$@"
)。
因此,我们正在调用带有内置参数的shell内置cd
(依次调用chdir()
syscall)。 此内置程序除了确定成功或失败之外没有其他作用的原因是,它正在从调用它的可执行文件中进行进程外操作-因此它将更改以#!/bin/sh
shebang开头的shell的工作目录,而不是树上的任何进程或外壳。
那么, 真正的 cd
内置外观是什么样的? 由于它简短易懂,因此让我们看一下Busybox ash
实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.