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
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.
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.
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
.