![Cygwin para executar arquivos de atalho do Windows (.LNK)](https://rvso.com/image/1417416/Cygwin%20para%20executar%20arquivos%20de%20atalho%20do%20Windows%20(.LNK).png)
Eu uso o Cygwin como meu substituto de cmd no Windows e estou limpando a variável PATH do meu sistema.
Agora tenho uma pasta contendo arquivos exe e atalhos (.LNK) que está em PATH contendo todos os pequenos aplicativos e softwares que uso na linha de comando.
Tudo funciona através do CMD, porém os atalhos, arquivos .LNK, não funcionam através do Cygwin. Em vez disso eu recebo
bash: /cygdrive/e/Apps/uniserver.lnk: não é possível executar o arquivo binário
Meu único palpite é porque ele acha que .lnk deveria ser um link simbólico?
Existe alguma maneira de fazer o Cygwin iniciar o atalho?
Responder1
Você pode executar arquivos Windows LNK do Cygwin usando o cygstart
utilitário, parte dopacote cygutils, do seguinte modo:
cygstart [OPTION]... FILE [ARGUMENTS]
Vercygstart --help
para as opções disponíveis.
O seguinte deve ser suficiente no seu caso:
cygstart /cygdrive/e/Apps/uniserver.lnk
Responder2
Eu fiz uma configuração semelhante e pensei se poderia economizar digitação .lnk
todas as vezes. Testado command_not_found_handle
ganchoadicionado a partir do Bash 4.0 e parece estar funcionando:
# add this to your .bashrc
command_not_found_handle ()
{
if [[ $1 == *.* || $1 == */* ]]; then
echo "$1: command not found"
return 127
fi
local binbase=/cygdrive/e/Apps/
local name=$1
shift
# You might want to tweak precedence
if [[ -f ./$name.bat ]]; then
exec "./$name.bat" "$@"
elif [[ -f ./$name.lnk ]]; then
cygstart "./$name.lnk" "$@"
elif [[ -f $binbase/$name.bat ]]; then
exec "$binbase/$name.bat" "$@"
elif [[ -f $binbase/$name.lnk ]]; then
cygstart "$binbase/$name.lnk" "$@"
else
echo "$name: command not found"
return 127
fi
}
por exemplo, digitar apenas uniserver
aciona esse gancho e /cygdrive/e/Apps/uniserver.lnk
o inicia.
Editar:Uma alternativa que encontra atalhos de $PATH inteiro.
command_not_found_handle ()
{
if [[ $1 == *.* || $1 == */* ]]
then
echo "$1: command not found"
return 127
fi
local name=$1
shift
if [[ -f ./$name.bat ]]
then
exec "./$name.bat" "$@"
elif [[ -f ./$name.lnk ]]
then
start "./$name.lnk" "$@"
elif [[ -f $(type -P $name.bat) ]]
then
exec "$(type -P $name.bat)" "$@"
elif [[ -f $(type -P $name.lnk) ]]
then
cygstart "$(type -P $name.lnk)" "$@"
else
echo "$name: command not found"
return 127
fi
}
Responder3
Use o comando interno do DOS start
. Suponho que o Cygwin NÃO tenha acesso aos integrados do DOS, então você terá que escrever um wrapper, como mystart.bat, e iniciar seu LNK usando o script wrapper.
Eu não acho que você possa "associar" os arquivos LNK no Cygwin para fazer com que o Cygwin inicie automaticamente o seu wrapper, mas talvez alguém possa sugerir uma maneira de fazer isso.