命令‘cd’在哪个包中?

命令‘cd’在哪个包中?

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

答案1

使用该命令查明命令的类型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 内置命令

这意味着,它是你 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 ...]

答案2

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

至于 的源代码cd,它所需要做的就是调用chdir(2),这会改变进程的工作目录。请参阅目录opengroup.org 指出:

chdir() 函数将导致路径参数指向的路径名命名的目录成为当前工作目录;也就是说,路径搜索不以“/”开头的路径名的起点。

答案3

这里有一个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 

请参阅手册页狂欢.链接内容cd如下:

cd [-L|-P] [目录]

将当前目录更改为 dir。变量 HOME 是默认目录。变量 CDPATH 定义包含 dir 的目录的搜索路径。CDPATH 中的备用目录名称以冒号 (:) 分隔。CDPATH 中的空目录名称与当前目录相同,即 ''.''。如果 dir 以斜杠 (/) 开头,则不使用 CDPATH。-P 选项表示使用物理目录结构而不是跟随符号链接(另请参阅 set 内置命令的 -P 选项);-L 选项强制跟随符号链接。参数 - 相当于 $OLDPWD。如果使用 CDPATH 中的非空目录名称,或者如果 - 是第一个参数,并且目录更改成功,则新工作目录的绝对路径名将写入标准输出。如果目录更改成功,则返回值为 true;否则为 false。

命令‘cd’在哪个包中?

那将是狂欢

答案4

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

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

相关内容