在PATH中运行与现有函数同名的可执行文件


16

有时,我定义了一个函数,该函数会遮盖可执行文件并调整其参数或输出。因此,该函数与可执行文件具有相同的名称,并且我需要一种方法,该方法如何从该函数运行该可执行文件而无需递归调用该函数。例如,要自动运行fossil diffthrough colordiffless -R我的输出,请使用:

function fossil () {
    local EX=$(which fossil)
    if [ -z "$EX" ] ; then
        echo "Unable to find 'fossil' executable." >&2
        return 1
    fi
    if [ -t 1 ] && [ "$1" == "diff" ] ; then
        "$EX" "$@" | colordiff | less -R
        return
    fi
    "$EX" "$@"
}

如果我确定可执行文件的位置,则只需输入即可/usr/bin/fossil。Bash意识到这/意味着该命令是可执行文件,而不是函数。但是由于我不知道确切的位置,所以我不得不求助于电话which并检查结果。有没有更简单的方法?


1
您说:“ Bash意识到这/意味着命令是可执行文件,而不是函数。”严格来说,这是不正确的。在我认为这是一个糟糕的(而且没有证件的)设计决定中,bash允许函数名称包含斜杠。斜线只是导致/usr/bin/fossil是一个不同的字符串fossil,所以,当你说/usr/bin/fossil,它不会尝试运行fossil功能。
G-Man说'恢复莫妮卡''18

Answers:


19

使用command内置的shell:

bash-4.2$ function date() { echo 'at the end of days...'; }

bash-4.2$ date
at the end of days...

bash-4.2$ command date
Mon Jan 21 16:24:33 EET 2013

bash-4.2$ help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.

2
另一种选择是转义命令\date
jordanm

4
@jordanm,仅适用于别名。问题是关于功能的。pastebin.com/TgkHQwbb
manatwork

3

在脚本中,该#!行通常用于/bin/env bash根据路径运行bash命令。(对于某些实用程序可能有所不同)。这也应该在这里工作...

command替代方法也应该有效,但可能取决于特定的shell)(它在Solaris的Bourne Shell上有效,但实际上/bin/command在这种情况下运行,它是Bash内置的shell)

双方/bin/command/bin/env在SUS上市,所以所有兼容的实现应该有它。


感谢您指出env。我不确定应该接受哪个答案,但是由于问题是关于bash的,所以内置bashcommand是最好的解决方案。
PetrPudlák2013年

1
在我的Linux没有command可执行文件,但command也适用于dashkshzsh。因此,我认为它不仅是内置于shell中bashpastebin.com/fi3gyNse
manatwork

它不是Solaris 10 Bourne(也可以作为heirloom-sh使用)的内置程序。具有已知路径的可执行文件的优点是它不能被函数覆盖。
Gert van den Berg 2013年

(缺少/ bin / command可能解释了如果脚本/bin/env不想对shell路径进行硬编码,为什么在哈希爆炸之后使用脚本)
Gert van den Berg 2013年

3

Gert的回答使我意识到,一个人也可以nice为此目的使用(我实际上在我的一个脚本中就已经使用了它,而没有意识到):

$ function date() { echo 'at the end of days...'; }
$ date
at the end of days...
$ nice -n0 date
Mon Jan 21 16:45:21 CET 2013

它不如其他答案那么优雅,但是在某些情况下,它可能是一个有用的选择。


您可能需要扩展它以包括类似的替代方法:`which date`
伊莱亚·卡根

1
@EliahKagan的问题`which something`是,如果没有something可执行文件,可能会发生不幸的事情。例如,如果echo丢失,则`which echo` /bin/rm preciousFile所做的事情与预期的完全不同。
PetrPudlák13年
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.