![Cygwin для запуска файлов ярлыков Windows (.LNK)](https://rvso.com/image/1417416/Cygwin%20%D0%B4%D0%BB%D1%8F%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20%D1%8F%D1%80%D0%BB%D1%8B%D0%BA%D0%BE%D0%B2%20Windows%20(.LNK).png)
Я использую Cygwin в качестве замены cmd в Windows и сейчас занимаюсь очисткой системной переменной PATH.
Теперь у меня есть папка, содержащая файлы exe и ярлыки (.LNK), которая находится в PATH и содержит все небольшие приложения и программное обеспечение, которое я использую из командной строки.
Все работает через CMD, однако ярлыки, .LNK файлы, не работают через Cygwin. Вместо этого я получаю
bash: /cygdrive/e/Apps/uniserver.lnk: невозможно выполнить двоичный файл
Я только предполагаю, что он думает, что .lnk — это символическая ссылка?
Можно ли как-то заставить Cygwin запустить ярлык?
решение1
Вы можете запустить файлы Windows LNK из Cygwin с помощью cygstart
утилиты, входящей в составпакет cygutils, следующее:
cygstart [OPTION]... FILE [ARGUMENTS]
Видетьcygstart --help
для доступных вариантов.
В вашем случае должно быть достаточно следующего:
cygstart /cygdrive/e/Apps/uniserver.lnk
решение2
Я сделал похожую настройку и подумал, что если бы я мог сэкономить время на вводе .lnk
каждый раз. Попробовал command_not_found_handle
крюкдобавлено в Bash 4.0 и выглядит работающим:
# 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
}
например, набор текста просто uniserver
запускает этот хук и находит /cygdrive/e/Apps/uniserver.lnk
для запуска.
Редактировать:Альтернатива, которая находит ярлыки по всему $PATH.
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
}
решение3
Используйте встроенную команду DOS start
. Я предполагаю, что Cygwin НЕ имеет доступа к встроенным командам DOS, поэтому вам придется написать оболочку, например mystart.bat, и запустить ваши LNK с помощью скрипта-оболочки.
Я не думаю, что вы можете «связать» LNK-файлы в Cygwin, чтобы Cygwin автоматически запускал вашу оболочку, но, возможно, кто-то другой сможет предложить способ сделать это.