Вопрос или проблема
Я создал ярлык для Windows с следующим назначением:
D:\APPS\cygwin64\bin\mintty.exe /bin/env PATH=/local/bin:/usr/local/bin:$PATH /bin/bash --login -i
Я ожидал, что он добавит к пути мои заданные значения, но этого не произошло:
$ echo $PATH
/usr/local/bin:/usr/bin:/local/bin:/usr/local/bin:$PATH:/usr/lib/lapack
т.е. текст $PATH
попал в содержимое без развертывания.
Как это обойти?
Ну, я вижу, что это приходит немного поздно, но надеюсь, это может помочь вам или кому-то другому с подобной проблемой.
Поскольку вы запускаете ярлык Windows, вместо использования синтаксиса для развертывания переменных окружения в cygwin/*nix ($VAR_NAME
) вам, вероятно, просто нужно использовать синтаксис для развертывания в Windows/CMD.exe (%VAR_NAME%
). Также я прикладываю две ссылки на Викиучебники ниже, которые должны покрыть практически все, что вам когда-либо понадобится для работы с пакетными файлами на будущее.
Тем не менее, я бы ожидал, что ваш синтаксис тоже сработает, и мне кажется, что существует некоторый способ сделать развертывания на “другой стороне”, так сказать. Если я смогу найти способ, работая над своим скриптом запуска терминала, я обновлю этот ответ.
Ссылки:
- Программирование CMD имеет большинство базового синтаксиса и основных команд
- Скриптование пакетных файлов Windows достаточно полный справочник по всему
Замечания/Предупреждение
cmd
скриптование оболочки оставляет желать лучшего, и я думаю, что вы можете легко найти в Google что-то, что даст вам полное представление обо всех деталях. Я просто хотел это упомянуть и сказать, что ничто не мешает вам использовать что-то вроде ‘MinGW-x64’ (я рекомендую изучить разницу между ‘MinGW-x64’ и оригиналом, если у вас есть сомнения; они поддерживаются разными организациями), или что-то вроде Cygwin, с которым вы явно уже имеете опыт, и то и другое позволит вам заниматься sh
/bash
скриптованием.
MinGW-x64 является упрощенной и имеет неполную реализацию POSIX из-за некоторых концепций, несовместимых с Windows Subsystem без дополнительной поддержки (ну, это, я думаю, Microsoft VC runtime; и я думаю, что есть обстоятельства, когда это необходимо хотя бы с MinGW если не MinGW-x64) но я упоминаю это первым, так как это ‘родное’ (т.е. ‘быстрое’) решение.
Cygwin предоставляет свой ‘слой совместимости’ .dll
, который обеспечивает достаточно полную среду POSIX, за счет (a) довольно значительных накладных расходов (по крайней мере, в некоторых случаях) и (b) наличия довольно сложной дополнительной .dll
, которая должна быть предоставлена с любым программным обеспечением, созданным с ее помощью, и за счет/пользы (в зависимости от вашей перспективы) того, что вы будете довольно сильно связаны с GPL, если используете это для своего проекта и связываетесь с слоем совместимости.
Тем не менее, как альтернатива, этот ответ упоминает предложение лицензии Red Hat на лицензионные условия Cygwin, отличные от GPL, если вы этого хотите. (И, конечно, при условии, что это экономически оправдано для вас и вашего проекта.) Однако для личного или внутреннего скриптования оболочки (т.е. не ‘распространяемого’, а значит, не охватываемого GPL) это может быть действительно хорошим выбором и почти наверняка будет лучше, чем борьба с идиосинкразиями продукта эпохи DOS, который все еще застрял в поддержке плохих решений, принятых более 30 лет назад.
По умолчанию /etc/profile добавляет Windows PATH в /usr/local/bin:/usr/bin
.
Вы хотите дополнительно иметь пути /local/bin:/usr/local/bin
. Это странно: директория /local
не существует, а /usr/local/bin
и так уже есть в пути.
Тем не менее, если вы все еще хотите, чтобы такое расширение пути происходило, я предлагаю сделать это дополнение внутри вашего ~/.profile
, а не в ярлыке.
Ответ или решение
Для корректного задания пути для MinTTY в среде Windows с использованием Cygwin, необходимо учесть несколько важных аспектов, касающихся синтаксиса командной строки и трактовки переменных окружения. Рассмотрим подробно вашу проблему и предложим решение.
Проблема
Вы создали ярлык на MinTTY с следующим целевым адресом:
D:\APPS\cygwin64\bin\mintty.exe /bin/env PATH=/local/bin:/usr/local/bin:$PATH /bin/bash --login -i
Однако ожидаемое поведение не выполняется: переменная $PATH
воспринимается как текст, а не как обозначение существующей переменной окружения.
Причины проблемы
-
Синтаксис переменных среды: В Windows для работы с переменными окружения используется синтаксис
%VAR_NAME%
, тогда как в Unix-подобных системах применяется$VAR_NAME
. Поскольку запуск MinTTY осуществляется через Windows, система не распознаёт$PATH
и добавляет его в строку без расширения. -
Проблемные пути: Вы указываете несуществующий каталог
/local
, что может не быть очевидным при формировании переменной PATH. Необходимо проверить необходимость этого пути.
Решение
Чтобы решить описанную вами проблему, вам следует использовать правильный синтаксис для расширения переменной окружения и, возможно, изменить способ, которым вы устанавливаете пути.
Вот как можно модифицировать команду:
D:\APPS\cygwin64\bin\mintty.exe /bin/env PATH=/local/bin:/usr/local/bin:%PATH% /bin/bash --login -i
Здесь мы используем %PATH%
, что позволит правильно расширить переменную окружения Windows перед передачей её в Cygwin.
Альтернативное решение
Вы можете также рассмотреть вариант добавления желаемых путей непосредственно в файл конфигурации ~/.profile
вместо того, чтобы мучиться с настройками в ярлыке. Добавляя необходимые пути в ~/.profile
, вы обеспечите их сохранение при каждом запуске оболочки. Пример добавления:
export PATH=/local/bin:/usr/local/bin:$PATH
Не забудьте перезапустить терминал или выполнить source ~/.profile
, чтобы изменения вступили в силу.
Дополнительные рекомендации
- Тестирование: После внесения изменений проверьте результат командой
echo $PATH
в MinTTY, чтобы подтвердить, что PATH настроен корректно. - Документация: Ознакомьтесь с официальной документацией Cygwin и MinTTY для более глубокого понимания их работы и конфигурации.
- Проверка существования директории: Убедитесь, что используемые вами пути существуют, чтобы избежать путаницы и ошибок в будущем.
Следуя вышеперечисленным рекомендациям, вы сможете успешно настроить MinTTY с правильно заданным путём, что улучшит вашу работу в Cygwin.