我想cd
根据我的需要自定义命令的功能。
我定义了以下函数 -
function cd () { cd "$@" && pushd "$@"; }
这个函数的目的是自动将目录压入堆栈,这样就省去了我pushd .
每次手动输入的精力。
然而,上面的函数是一个无限递归函数,因为调用cd
被解释为函数本身而不是cd
内置函数。
如何引用cd
此函数中的内置函数?
我知道可以使用 来转义别名\
。以更明确的方式转义函数或引用内置函数的方法是什么?
注意:我不想将我的函数重命名为其他名称。
答案1
Bash 有一个(内置)命令builtin
,它完全可以满足您的需要。在函数中替换cd
为builtin cd
将修复递归。
答案2
这command
builtin 强制将命令名称解释为内置或外部命令(跳过别名和函数查找)。它可在所有 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\";"
}