如何显式调用内置的shell?


14

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

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

此功能的目的是自动将目录推送到堆栈上,这样可以节省我pushd .每次手动键入的工作量。

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

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

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

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


3
为什么不只是alias cd=pushd?cd到非绝对路径(例如cd ../)时,您期望发生什么?
Patrick

@Patrick pushd不支持-P。但是您是对的,如问题所示function cd,它看起来有点错误,因为它两次更改了目录。
蒂诺

Answers:


6

所述command内置的力的命令名被解释为一个内置或外部命令(跳过别名和功能查找)。它在包括bash在内的所有POSIX shell中都可用。

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

(请注意,此示例是一个不好的示例:它不适用于相对路径,您最好只键入pushd第一位。)

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


16

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


1

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

因此,另一种方法也可以用于非内置的功能,即为函数命名,然后为包装的命令定义别名。之所以可行,是因为函数的执行上下文中不存在别名。

示例wrapper.sh:

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

在例如.bash_aliases中:

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

但是,这很hacky。command如果可能,最好使用。


-1

为了使它与相对路径一起使用,需要执行以下操作:

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\";"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.