Добавьте некоторое расширение по умолчанию к исполняемому поиску

Я использую Ubuntu в Windows после Обновления Создателей, и я заметил, что теперь это может выполнить собственный компонент Windows Exe. Это также включает по умолчанию Windows Path в конце Пути Ubuntu, позволяя Вам получить доступ ко всем утилитам Windows с самого начала.

Единственная проблема состоит в том, что исполняемый файл Windows имеет расширение (.exe), поэтому если, например, я имею 7z для Windows в пути, в ударе я все еще должен ввести

7z.exe

Использовать его.

Я хотел бы установить его в некотором роде для ввода

7z

и он ищет обоих 7z и 7z.exe.

Есть ли способ добавить одно или несколько расширений по умолчанию, как высказывание, "если Вы не находите его, поскольку я записал это, попытайтесь добавить это расширение (расширения) в конце"

5
задан 7 August 2017 в 00:08

1 ответ

Если Вы готовы потерять значение по умолчанию command-not-found функции (которые ищут пакеты, обеспечивающие команду, и т.д.), то определите a command_not_found_handle функция, которая тестирует если a .exe версия доступна в PATH:

command_not_found_handle ()
{
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        return 127;
    fi
}

Например, тестирование с sh вместо .exe:

$ z
z: command not found
$ command_not_found_handle () { if command -v "$1"sh; then "$1"sh "${@:2}"; return $?; else return 127; fi; }
$ z -c 'echo "$@"' _ b c
/usr/bin/zsh
b c
$ ba -c 'echo "$@"' _ b c
/bin/bash
b c

Конечно, это зависит от того, как WSL сцепляется в удар для обеспечения доступа к командам Windows (если WSL использует command_not_found_handle самостоятельно, затем это не будет работать). Протестированный на WSL, это работает.


Оригинал, по умолчанию, определение command_not_found_handle находится в /etc/bash.bashrc:

$ tail -15 /etc/bash.bashrc
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi

Можно просто включать тот код в redifinition:

command_not_found_handle ()
{
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        # check because c-n-f could've been removed in the meantime
        if [ -x /usr/lib/command-not-found ]; then
           /usr/lib/command-not-found -- "$1"
           return $?
        elif [ -x /usr/share/command-not-found/command-not-found ]; then
           /usr/share/command-not-found/command-not-found -- "$1"
           return $?
        else
           printf "%s: command not found\n" "$1" >&2
           return 127
        fi
    fi
}

Или, используйте этот прием для автоматической вставки старого определения:

eval "original_$(declare -f command_not_found_handle)"
command_not_found_handle () {
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        original_command_not_found_handle "$@"
    fi
}
4
ответ дан 23 November 2019 в 09:30

Другие вопросы по тегам:

Похожие вопросы: