Existe um equivalente Unix da variável de ambiente Windows PATHEXT?

10

Eu estou querendo saber se existe um equivalente Unix para a variável de ambiente Windows PATHEXT .

Para aqueles sem histórico do Windows: Adicionar um sufixo de arquivo a PATHEXT permite que eu execute um script sem digitar esse sufixo no cmd.exe. Por exemplo, no meu computador com Windows, o PATHEXT contém o sufixo .pl e quando quero executar um script Perl no cmd.exe, simplesmente consigo digitar my-script e ele é executado. No entanto, para executar o mesmo script no bash, preciso escrever o nome completo: my-script.pl .

Como trabalho no Windows e no Unix atualmente, quase sempre caio na armadilha de esquecer de digitar o sufixo ao ir para uma caixa do Unix novamente.

    
por René Nyffenegger 02.05.2016 / 10:35

3 respostas

7

curto: não

maior: scripts de shell requerem um nome de arquivo completo, mas você pode definir aliases para os seus comandos para se referir a eles por vários nomes. Por exemplo

alias my-script=my-script.pl
    
por 02.05.2016 / 10:47
13

A solução mais simples é simplesmente não usar extensões para seus scripts. Eles não são necessários e servem apenas para identificar o tipo de script para você, mas não para o computador. Enquanto o Windows usa extensões para identificar o tipo de arquivo, os sistemas * nix (com pouquíssimas exceções, como gzip ) não.

Observe que os binários não têm a extensão .exe em * nix, eles são chamados apenas de foo , não foo.exe . Então, se você quiser que foo.pl seja executável como foo , simplesmente salve o arquivo como foo em primeiro lugar.

Alternativamente, se você realmente precisa ter as extensões por algum motivo, entre em qualquer diretório em que você salvar seus scripts e execute isto:

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

Isso iterará todos os arquivos com extensões e, para cada arquivo foo.ext deles, criará um link chamado foo , que aponta para foo.ext . Observe que isso falhará se você tiver vários scripts com o mesmo nome, mas extensões diferentes.

    
por 02.05.2016 / 12:11
7

Se você realmente quer fazer isso, existe um jeito. Adicione o seguinte no final de .bashrc em seu diretório pessoal e defina PATHEXT para nomes de extensões com pontos separados por : . (Alterado para incluir os pontos para corresponder ao comportamento do Windows.) Use-o por sua conta e risco.

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
}

Lembre-se também que você pode usar a aba para completar o nome do comando se não houver outro comando que também comece com my-script .

    
por 02.05.2016 / 17:14