Чи існує еквівалент 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
Рене Nyffenegger

Відповіді:


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
}

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.