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

11

Gostaria de saber se existe um equivalente Unix para a variável de ambiente do Windows PATHEXT.

Para aqueles sem fundo do Windows: Adicionar um sufixo de arquivo para PATHEXTpermitir a execução de um script sem digitar esse sufixo em cmd.exe. Por exemplo, no meu computador com Windows, PATHEXT contém o sufixo .ple, quando quero executar um script Perl no cmd.exe, simplesmente digito my-scripte ele é executado. No entanto, a fim de executar o mesmo script em bash, eu preciso escrever o nome completo: my-script.pl.

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

René Nyffenegger
fonte
Seria interessante saber o que o Windows fez se o PATHEXT contivesse, por exemplo, .sh e .pl e você tentasse executar 'foo' em um diretório com foo.sh e foo.pl.
Jeff Schaller
Se .shpreceder .pl, foo.shserá executado. stackoverflow.com/a/7839178/180275
René Nyffenegger

Respostas:

7

curto: não

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

alias my-script=my-script.pl
Thomas Dickey
fonte
12

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 muito poucas exceções, como gzip) não o fazem.

Observe que os binários não têm .exeextensão no * nix, eles são chamados apenas foo, não foo.exe. Portanto, se você quiser foo.plser executável como foo, simplesmente salve o arquivo como fooem primeiro lugar.

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

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

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

terdon
fonte
7

Se você realmente quer fazer isso, existe um caminho. Adicione o seguinte no final do .bashrcseu diretório pessoal e defina os PATHEXTnomes das 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 de que você pode usar tab para concluir o nome do comando se não houver outro comando também começando my-script.

user23013
fonte