Cygwin para ejecutar archivos de acceso directo de Windows (.LNK)

Cygwin para ejecutar archivos de acceso directo de Windows (.LNK)

Utilizo Cygwin como reemplazo de cmd en Windows y estoy en el proceso de limpiar la variable PATH de mi sistema.

Ahora tengo una carpeta que contiene archivos exe y accesos directos (.LNK) que se encuentra en la RUTA que contiene todas las pequeñas aplicaciones y software que uso desde la línea de comandos.

Todo funciona a través de CMD, sin embargo, los accesos directos, archivos .LNK, no funcionan a través de Cygwin. en lugar de eso obtengo

bash: /cygdrive/e/Apps/uniserver.lnk: no se puede ejecutar el archivo binario

Mi única suposición es porque cree que se supone que .lnk es un enlace simbólico.

¿Hay alguna forma de lograr que Cygwin inicie el acceso directo?

Respuesta1

Puede ejecutar archivos LNK de Windows desde Cygwin usando la cygstartutilidad, parte depaquete cygutils, como sigue:

cygstart [OPTION]... FILE [ARGUMENTS]

Vercygstart --helppara las opciones disponibles.

Lo siguiente debería ser suficiente en su caso:

cygstart /cygdrive/e/Apps/uniserver.lnk

Respuesta2

Hice una configuración similar y pensé si podría ahorrar escribir .lnkcada vez. Intentó command_not_found_handleganchoagregado a partir de Bash 4.0 y parece funcionar:

# 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 ejemplo, escribir simplemente uniserveractiva este gancho y busca /cygdrive/e/Apps/uniserver.lnkiniciarlo.

Editar:Una alternativa que encuentra atajos de $PATH completo.

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
}

Respuesta3

Utilice el comando integrado de DOS start. Sin embargo, supongo que Cygwin NO tiene acceso a las funciones integradas de DOS, por lo que tendrás que escribir un contenedor, como mystart.bat, e iniciar tu LNK usando el script contenedor.

No creo que pueda "asociar" los archivos LNK en Cygwin para que Cygwin inicie automáticamente su contenedor, pero tal vez alguien más pueda sugerir una forma de hacerlo.

información relacionada