使用相同名称优先使用用户函数的$ PATH可执行文件?

时间:2014-11-15 18:56:03

标签: bash shell

  • ./bin中有$PATH
  • 我的serve()个来源文件中定义了一个函数~/.bashrc
  • 我在/Users/deefour/some/project/bin/serve
  • 上有一个脚本

当我cd进入/Users/deefour/some/project并运行

➜ serve

正在执行serve()功能。有没有办法在不明确运行

的情况下赋予bin/serve脚本优先权
➜ ./bin/serve

或者一般来说,有没有办法通过$PATH查找优先级通过相同名称的用户定义函数发出命令?

3 个答案:

答案 0 :(得分:2)

如果你跑

command serve

...然后这将忽略任何名为serve的函数,并且只从PATH执行外部命令。


或者,您可以编写函数以在存在的情况下通过外部命令:

serve() {
  if type -P serve >/dev/null; then
    command serve "$@"
  else
    # ...function contents here...
  fi
}

作为另一种选择,您可以创建“回退”函数的命名空间,并从command_not_found_handle钩子中调用它们:

command_not_found_handle() {
  if type "fallback__$1" >/dev/null; then
    "fallback__$@"
  else
    printf 'Command not found: %q\n' "$1" >&2
    return 127
  fi
}
fallback__serve() {
  # your normal serve function
}

答案 1 :(得分:0)

尝试写

`which serve`

而不是

serve

甚至是类似的东西

run_executable() {
    program="$1"
    fullname=`which "$program"`
    [ "$?" -eq 0 ] || return 127
    "$fullname"
}
run_executable serve

答案 2 :(得分:-1)

我似乎记得使用\ command来覆盖别名。这也适用于覆盖功能。我现在不在电脑前测试它。