命令“cd”在哪个包中?

22 package-management cd-command

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

Byt*_*der 55

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

$ type cd
cd is a shell builtin
$ type ls
ls is aliased to `ls --color=auto'
$ type cat
cat is /bin/cat
Run Code Online (Sandbox Code Playgroud)

可以看到,cdshell内建的

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

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

$ dpkg -S $(which cat)
coreutils: /bin/cat
Run Code Online (Sandbox Code Playgroud)

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

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

[... output shortened ...]
Run Code Online (Sandbox Code Playgroud)

  • `dpkg -S` 仅适用于软件包安装的软件 - 如果它们是从 tarball 或 bin 文件安装的,它不会在那里帮助它们 - 但 `type` 仍会将其识别为不同的二进制文件,而不是内置或别名 (5认同)
  • 是的,但我希望我们在回答有关默认应用程序的问题时假设一个普通的 Ubuntu。没有安装 bash 的 Ubuntu 似乎不太可能;-) (4认同)
  • 我建议使用 `type -a cd` 来显示此命令的 `a`ll 位置。仍然应该只有内置的shell。例如,与内置和 /usr/bin 变体中的 `type -a printf` 进行比较。 (4认同)
  • @DigitalTrauma:很好的评论!实际上,有两种内置函数:*必须*是内置函数,因为它们*不能*可能作为外部命令(例如`cd`、`set`,它们会改变调用进程的环境)和“便利”内置函数,它们是出于性能原因(避免子shell的开销)或因为您希望即使在具有完全控制的`$PATH`或类似内容的系统上也可以使用它们(例如`[`,`echo`,`printf`) )。后者有时会导致混淆,因为例如 `man echo` 会显示命令的联机帮助页,但是…… (2认同)

Tim*_*m B 25

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

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

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

  • 的确。比较 [为什么`sudo cd /var/named` 不起作用?](http://askubuntu.com/q/291666/11751)。 (3认同)
  • 对。我只添加了一个答案,因为其他答案没有说明为什么 `cd` 必须是内置的。更具误导性的是,有时实际上存在一个`/usr/bin/cd`。 (3认同)

Rin*_*ind 18

这是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 
Run Code Online (Sandbox Code Playgroud)

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

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

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

命令“cd”在哪个包中?

那将是bash

  • 除此之外,虽然许多内置工具*可能*是外部命令,但 `cd` 命令无法实现为外部命令,因为子进程不可能更改其父进程的工作目录. (5认同)

小智 5

的实际源代码cd是为

  • builtins/cd.def文件末尾猛击
  • TCSHsh.dir.c作为函数dochngd
  • PDKSH(在某些 BSD 中发现的公共域 Korn shell)位于c_ksh.c文件的右侧
  • Korn 93(原Korn外壳,旧版)在src/cmd/ksh93/bltins/cd_pwd.c

该SYS呼叫chdir

  • Linux内核fs/open.c
  • FreeBSD是本文开头的链接指向的地方
  • 其他 BSD 类型的操作系统和 OpenSolaris 的工作方式非常相似

可能需要注意的是,系统调用仍然不是链的末端,这将在单个文件系统级别下降。


归档时间:

查看次数:

5723 次

最近记录:

9 年,7 月 前