如何显式调用内置的 shell?

如何显式调用内置的 shell?

我想cd根据我的需要自定义命令的功能。

我定义了以下函数 - function cd () { cd "$@" && pushd "$@"; }

这个函数的目的是自动将目录压入堆栈,这样就省去了我pushd .每次手动输入的精力。

然而,上面的函数是一个无限递归函数,因为调用cd被解释为函数本身而不是cd内置函数。

如何引用cd此函数中的内置函数?

我知道可以使用 来转义别名\。以更明确的方式转义函数或引用内置函数的方法是什么?

注意:我不想将我的函数重命名为其他名称。

答案1

Bash 有一个(内置)命令builtin,它完全可以满足您的需要。在函数中替换cdbuiltin cd将修复递归。

答案2

commandbuiltin 强制将命令名称解释为内置或外部命令(跳过别名和函数查找)。它可在所有 POSIX shell 中使用,包括 bash。

cd () { command cd "$@" && pushd "$@"; }

(请注意,这个示例是一个糟糕的示例:它不适用于相对路径,您不妨pushd首先键入。)

在 bash 和 zsh(但不是 ksh)中,您可以使用builtin强制将命令名称解释为内置命令,不包括别名、函数和外部命令。

答案3

我怀疑当您说“不想将函数重命名为其他名称”时,您的意思是您希望能够使用与原始命令相同的名称来调用函数。

因此,另一种方法也适用于非内置的东西,即将您的函数命名为其他名称,然后为包装的命令定义一个别名。这是可行的,因为别名不存在于函数的执行上下文中。

示例wrapper.sh:

#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }

例如,在 .bash_aliases 中:

source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"

但这是相当老套的。command如果可能的话最好使用。

答案4

为了使用相对路径,需要以下内容:

function cd { 
   dir="$(realpath "$@")"
   command cd "$dir"
   pushd "$dir"
}

这假设您使用的是足够现代的 Linux 发行版,其中包含“realpath”实用程序。 (例如 RHEL 6 则不然)。如果 Perl 可用,则可以使用以下命令模拟“realpath”:

! realpath $(pwd) > /dev/null 2>&1  && function realpath {
    perl -e "use Cwd realpath; print realpath(\"$1\") . \"\\n\";"
}

相关内容