Adicione alguma extensão padrão à pesquisa executável

4

Estou usando o Ubuntu no Windows após a Atualização dos Criadores e percebi que agora ele pode executar o Windows nativo Exe. Ele também inclui por padrão o Caminho do Windows no final do Caminho do Ubuntu, permitindo que você acesse todos os utilitários do Windows desde o início.

O único problema é que o executável do Windows tem a extensão (.exe), por isso, se por exemplo eu tenho 7z para o Windows no caminho, no bash eu ainda tenho que digitar

7z.exe

Para usá-lo.

Gostaria de definir de alguma forma o tipo

7z

e ele procura 7z e 7z.exe .

Existe uma maneira de adicionar uma ou mais extensões padrão, como dizer "se você não encontrá-lo como eu o escrevi, tente adicionar essa (s) extensão (s) no final"

    
por bracco23 06.08.2017 / 16:34

1 resposta

4

Se você estiver disposto a perder os recursos padrão de comando não encontrado (que procuram pacotes fornecendo o comando etc.), defina uma função command_not_found_handle que testa se uma versão .exe está disponível no PATH :

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

Por exemplo, teste com sh em vez de .exe :

$ z
z: command not found
$ command_not_found_handle () { if command -v ""sh; then ""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

É claro que isso depende de como o WSL está se conectando ao bash para fornecer acesso aos comandos do Windows (se o WSL estiver usando command_not_found_handle , isso não funcionará). Testado no WSL funciona.

A definição original, padrão, de command_not_found_handle está em /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 -- ""
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- ""
                   return $?
                else
                   printf "%s: command not found\n" "" >&2
                   return 127
                fi
        }
fi

Você pode simplesmente incluir esse código no redifinition:

command_not_found_handle ()
{
    if command -v "".exe; then
        "".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 -- ""
           return $?
        elif [ -x /usr/share/command-not-found/command-not-found ]; then
           /usr/share/command-not-found/command-not-found -- ""
           return $?
        else
           printf "%s: command not found\n" "" >&2
           return 127
        fi
    fi
}

Ou use este truque para inserir automaticamente a definição antiga:

eval "original_$(declare -f command_not_found_handle)"
command_not_found_handle () {
    if command -v "".exe; then
        "".exe "${@:2}";
        return $?;
    else
        original_command_not_found_handle "$@"
    fi
}
    
por muru 07.08.2017 / 09:39