关于内置命令拼图

时间:2013-08-14 07:36:09

标签: bash command built-in

[root@MGWSDT_FEWS bin]# type cd
cd is a shell builtin
[root@MGWSDT_FEWS bin]# which cd
/usr/bin/which: no cd in (.:/usr/expect/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/real/RealPlayer:/root/bin)

它说因为cd是内置命令,所以'哪个cd'失败了。

'pwd'也是一个内置命令,为什么'哪个pwd'可以获得它的位置?

[root@MGWSDT_FEWS ~]# type pwd
pwd is a shell builtin
[root@MGWSDT_FEWS ~]# which pwd
/bin/pwd

6 个答案:

答案 0 :(得分:1)

了解对于sudo或任何其他不是内置shell的命令,当命令终止时,shell会在命令运行之前从中断处继续(当然,shell的当前工作目录赢了不要改变。因此,cd必须是内置的shell;否则,当cd终止时,shell将返回到同一个旧的当前工作目录。换句话说,子进程(即外部命令)不能更改父进程(即shell)的工作目录。

礼貌:https://bbs.archlinux.org/viewtopic.php?id=127225

答案 1 :(得分:0)

cd命令是bash的命令。 (bash内置命令)

你可以在“man bash& find cd”

中找到cd的用法

相反,pwd是独立命令。

答案 2 :(得分:0)

内置命令是shell中的内部命令,其优先级高于外部命令(文件)。内置命令的优先级也低于函数,因此如果你有一个与内置命令同名的函数,内置实际上很有用:

function cd {
    if [[ $# -gt 0 ]]; then
        echo "Changing directory to $1."
        builtin cd "$1"
    else
        echo "Changing to default directory."
        builtin cd
    fi
}

cd "/some/where"

在内置函数之前首先调用汇总函数,并在二进制命令或文件之前首先调用内置函数。我认为类型命令在解释参数时也会遵循该顺序。

答案 3 :(得分:0)

有几个“命令”重复的实例,但这当然取决于您的安装。如果您有一个名为pwd的内置shell,那么将使用它,但可能有shell(csh)没有pwd作为内置。

printf是内置于bashksh93的shell,但不适用于ksh88csh

另一个(weirder)示例是[,它是一个内置的shell,但(在某些系统上)是test的符号链接(也可能是内置的shell)。 / p>

您的安装是为了支持许多shell和其他程序,而不仅仅是bash

答案 4 :(得分:0)

cd必须是shell内置的,因为它是一个单独的进程,然后在命令退出后命令的效果会消失。 (见Sakthi Kumar的回答。)

另一方面,其他一些命令如pwdtest可用作二进制文件,例如/bin/pwd/usr/bin/test ...但是,为了优化,shell已经还在/ bin / bash本身中实现了这些二进制文件,从而避免了创建单独进程的开销。

当您调用pwd时,shell会调用自己的pwd实现。您可以使用/bin/pwd而不仅仅是command pwd来调用二进制文件pwd

答案 5 :(得分:0)

pwdecho等命令是bash-builtins,也可以作为外部命令使用。您可以使用enable启用/禁用shell内置。

以下示例说明如何以shell-builtin或外部命令pwd调用/bin/pwd

$ type pwd
pwd is a shell builtin
$ which pwd
/bin/pwd
$ enable -n pwd
$ type pwd
pwd is /bin/pwd
$ which pwd
/bin/pwd
$ enable pwd
$ type pwd
pwd is a shell builtin
$ which pwd
/bin/pwd