Cygwin para executar arquivos de atalho do Windows (.LNK)

Cygwin para executar arquivos de atalho do Windows (.LNK)

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 cygstartutilitário, parte dopacote cygutils, do seguinte modo:

cygstart [OPTION]... FILE [ARGUMENTS]

Vercygstart --helppara 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 .lnktodas as vezes. Testado command_not_found_handleganchoadicionado 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 uniserveraciona esse gancho e /cygdrive/e/Apps/uniserver.lnko 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.

informação relacionada