2014-11-15 2 views
1
  • У меня ./bin в моем $PATH.
  • У меня есть функция serve(), определенная в одном из файлов моих ~/.bashrc источников.
  • У меня есть сценарий на /Users/deefour/some/project/bin/serve

Когда я cd в /Users/deefour/some/project и запустить

➜ serve 

serve() функция выполняется. Есть ли способ, чтобы дать приоритет в bin/serve сценария, без явного запуска

➜ ./bin/serve 

или вообще, есть ли способ, чтобы дать команды, найденные с помощью $PATH поиска приоритета над определенным пользователем функциями с одинаковым именем?

ответ

2

Если запустить

command serve 

... тогда это игнорирует любую функцию с именем serve и выполняет только внешнюю команду из PATH.


В качестве альтернативы, вы можете написать функцию, чтобы через упасть на внешнюю команду, когда она существует:

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

В качестве другой альтернативы, вы можете создать пространство имен «резервные» функций, и называть их от command_not_found_handle крючка:

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

Мне это нравится, но мой идеал заключается в том, чтобы ничего не вводить из командной строки. Я ищу, если существует './Bin/serve', запустите это, если нет, запустите функцию' serve() ', полученную из' ~/.bashrc'. В идеале, что-то, что не является специфическим для этой команды. – deefour

+0

Если это то, что вы хотите, тогда вы захотите определить функцию по-разному.Я могу придумать несколько подходов: либо вы определяете своего обработчика с отсутствием команды catch-all для поиска в пространстве имен функций, либо вы пишете свою функцию, чтобы сначала искать команду в PATH с тем же именем и действовать только тогда, когда не найден. –

+0

А я думаю, что я могу что-то сделать на основе вашего редактирования и идеи «catch-all command-not-found handle». Спасибо! – deefour

-1

Кажется, я помню, используя команду \ для переопределения псевдонимов. Это может также работать для переопределения функций. Я сейчас не на компьютере, чтобы проверить его.

+1

ли в downvoters * думаю * это не будет работать, или же они * знаю * это не будет работать? –

+0

Downvoting без сопроводительного комментария относительно того, почему трусливо, imho. Пожалуйста, помогите мне понять, как улучшить ответ или, по крайней мере, исправить его. – Beirdo

0

Попробуйте написать

`which serve` 

вместо

serve 

или даже что-то вроде этого

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

Зачем проверять '$?' Явно? 'local fullname; fullname = $ (который "$ 1") || return 127' –

+0

(если вы явно не объявляете своих местных жителей, они создаются в глобальной области действия - переменные функций bash попадают в глобальную область по умолчанию, как и в случае с javascript). –

Смежные вопросы