Существует ли Unix-эквивалент переменной среды Windows PATHEXT

11

Мне интересно, есть ли Unix-эквивалент для переменной среды Windows PATHEXT.

Для тех, у кого нет фона Windows: добавление суффикса файла PATHEXTпозволяет мне выполнять скрипт без ввода этого суффикса в cmd.exe. Например, на моем компьютере с Windows PATHEXT содержит суффикс, .plи когда я хочу выполнить скрипт Perl в cmd.exe, я просто могу напечатать, my-scriptи он запускается. Тем не менее, для того , чтобы выполнить один и тот же сценарий в Баш, мне нужно написать полное имя: my-script.pl.

Поскольку в настоящее время я работаю как с Windows, так и с Unix, я почти всегда попадаюсь в ловушку, когда забываю вводить суффикс при переходе в окно Unix.

Рене Ниффенеггер
источник
Было бы интересно узнать, что делает Windows, если PATHEXT содержит, например, .sh и .pl, и вы пытаетесь запустить 'foo' в каталоге с foo.sh и foo.pl.
Джефф Шаллер
Если .shпредшествует .pl, foo.shбудет запущен. stackoverflow.com/a/7839178/180275
Рене Ниффенеггер

Ответы:

7

короткий: нет

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

alias my-script=my-script.pl
Томас Дики
источник
12

Самое простое решение - просто не использовать расширения для ваших скриптов. Они не нужны и служат только для идентификации типа сценария для вас, но не для компьютера. В то время как Windows использует расширения для определения типа файла, системы * nix (за очень немногими исключениями, такими как gzip) - нет.

Обратите внимание, что двоичные файлы не имеют .exeрасширения в * nix, они просто называются foo, а не foo.exe. Итак, если вы хотите foo.plбыть исполняемым как foo, просто сохраните файл как fooна первом месте.

В качестве альтернативы, если вам действительно нужны расширения по какой-либо причине, перейдите в любой каталог, в котором вы сохраняете свои скрипты, и запустите это:

for f in *.*; do ln -s "$f" "${f%%.*}"; done

Это будет перебирать все файлы с расширениями и для каждого foo.extиз них будет создавать ссылку, fooкоторая указывает на foo.ext. Обратите внимание, что это не удастся, если у вас есть несколько сценариев с тем же именем, но с разными расширениями.

Тердон
источник
7

Если вы действительно хотите это сделать, есть способ. Добавьте следующее в конец .bashrcвашего домашнего каталога и задайте PATHEXTимена расширений с точками, разделенными :. (Изменено, чтобы включить точки, соответствующие поведению Windows.) Используйте его на свой страх и риск.

if declare -f command_not_found_handle >/dev/null; then 
    eval "original_command_not_found_handle() $(declare -f command_not_found_handle|tail -n +2)"
fi
command_not_found_handle(){
    local PATHEXT_EXPANDED i
    IFS=: read -a PATHEXT_EXPANDED<<<"$PATHEXT"
    for i in "${PATHEXT_EXPANDED[@]}"; do
        if type "$1$i" &>/dev/null; then
            "$1$i" "${@:2}"
            return $?
        fi
    done
    if declare -f original_command_not_found_handle >/dev/null; then
        original_command_not_found_handle "$@"
    else
        return 127
    fi
}

Также помните, что вы можете использовать tab для завершения имени команды, если нет другой команды, также начинающейся с my-script.

user23013
источник