有人可以解释`cd` shell命令的来源吗?

时间:2016-08-04 19:53:09

标签: freebsd

$ 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后谁记录状态更改。它在文件中吗?

1 个答案:

答案 0 :(得分:4)

这是{strong>不 cd内置版,它实际上并不起作用,除了告诉目录是否可以更改为如果不能,则以非零退出状态失败。

试一试:

"$(which cd)" /

......什么都不做。

实际的cd内置版是shell的一部分,用C编写,并调用chdir()系统调用。此系统调用更新您的进程状态 - 由内核跟踪 - 以具有不同的工作目录。

...那么,那个shell脚本的大块呢?让我们分解一下:

builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"}

...首先,我们echo tr将命令本身(由于缺少引号而有点错误的方式)CD,并将其更改为更低的 - 例如,如果通过名为cd的硬链接调用它,它仍将映射到名为${1+"$@"}的内置链接。

...第二,"$@"传递所有参数(${foo+bar}),如果有任何参数(bar扩展为{{1} }只有在定义了foo时才会这样做。

因此,我们通过传递的参数调用shell-builtin cd(进而调用chdir()系统调用)。除了确定成功或失败之外,这个内置没有任何影响的原因是因为它从调用它的可执行文件中运行了进程外 - 所以它改变了由{{1}启动的shell的工作目录shebang,但不是树上的任何进程或shell。

那么,真实 #!/bin/sh内置的外观是什么样的?由于它简短易读,请查看Busybox cd实现。

  • Here是入口点......
  • Here是实际操作。
  • Here是实际操作调用的系统调用的手册。