当前位置: 首页>>技术教程>>正文


‘cd’ 命令在哪个包中?

,

问题描述

我想查看命令 cd 背后的源代码,但 cd 似乎没有自己的包,那么它在哪个包中?

最佳方法

找出使用 type 命令的命令的类型。

$ type cd
cd is a shell builtin
$ type ls
ls is aliased to `ls --color=auto'
$ type cat
cat is /bin/cat

你可以看到,cd 是一个内置的 shell。

这意味着,它是默认情况下 Bash 的 shell 的一部分。这当然也是它所包含的软件包。

对于不是 shell 内置程序而是可执行文件的已安装命令,使用 dpkg -S 查找包:

$ dpkg -S $(which cat)
coreutils: /bin/cat

要获得有关内置命令的帮助,请使用 help 命令(也是内置命令):

$ help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
    Change the shell working directory.

[... output shortened ...]

次佳方法

cd 必然是壳 内置。如果 shell 产生一个改变工作目录然后退出的子进程,则父进程(shell 本身)不会受到影响。

至于 cd 的源代码,只需调用 chdir(2) 即可,改变进程的工作目录。请参阅 opengroup.org 上的 chdir,其中指出:

The chdir() function shall cause the directory named by the pathname pointed to by the path argument to become the current working directory; that is, the starting point for path searches for pathnames not beginning with ‘/’.

第三种方法

这是一个 man page for cd 但它不是官方的,因为 cd 是“Shell 内置命令”的一部分。就像其他一些命令一样……

alias, bg, bind, break, builtin, command, compgen, complete, 
continue, declare, dirs, disown, echo, enable, eval, exec, exit, 
export, fc, fg, getopts, hash, help, history, jobs, kill, let, local, 
logout, popd, printf, pushd, pwd, read, readonly, return, set, shift, 
shopt, source, suspend, test, times, trap, type, typeset, ulimit,
umask, unalias, unset, wait 

请参阅 bash 的手册页。从链接 cd 状态:

cd [-L|-P] [dir]

Change the current directory to dir. The variable HOME is the default dir. The variable CDPATH defines the search path for the directory containing dir. Alternative directory names in CDPATH are separated by a colon (:). A null directory name in CDPATH is the same as the current directory, i.e., ”.”. If dir begins with a slash (/), then CDPATH is not used. The -P option says to use the physical directory structure instead of following symbolic links (see also the -P option to the set builtin command); the -L option forces symbolic links to be followed. An argument of – is equivalent to $OLDPWD. If a non-empty directory name from CDPATH is used, or if – is the first argument, and the directory change is successful, the absolute pathname of the new working directory is written to the standard output. The return value is true if the directory was successfully changed; false otherwise.

Which package is the command ‘cd’ in?

那将是 bash

第四种方法

cd 的实际源代码是为

  • Bashbuiltins/cd.def 文件末尾

  • TCSHsh.dir.c 中作为函数 dochngd

  • PDKSH(在某些 BSD 中发现的公共域 Korn shell)位于文件顶部的 c_ksh.c

  • src/cmd/ksh93/bltins/cd_pwd.c 中的 Korn 93(原始 Korn shell,旧版本)

sys-call chdir

  • Linux kernelfs/open.c

  • FreeBSD 是这个项目开头的链接指向的地方

  • 其他 BSD-type 操作系统和 OpenSolaris 的工作方式非常相似

可能需要注意的是 sys-calls 仍然不是链的末端,它会在单个文件系统级别关闭。

第五种方法

是的,正如每个人所写的,cd 内置于您使用的任何 shell 中,因为进程不能影响其父进程的工作目录。 cd 有一些花里胡哨的东西(我的意思是 pushd 和朋友,cd 没有争论,等等),但如果你不厌其烦地挖掘源代码,你会不知所措:主要是 cd 调用chdir(2) 系统调用。

没什么可看的,因为与 HOME 之类的环境变量不同,”working directory” 是一个系统原语:它是每个进程都具有的属性之一,例如(真实的)用户 ID 或调度优先级。它是打开具有相对路径的文件的起点。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11912.html,未经允许,请勿转载。