2

Я столкнулся со странно выглядящей проблемой, пытаясь заставить скрипт сборки (от стороннего производителя) работать на моей установке с Win7 и Cygwin (последняя версия). Возможно, эту проблему лучше всего описать на примере фрагмента сценария bash :

foo="/cygdrive/c/svn/Projects/Client Config/Android/Repack/foo/out"
cygpath -w "$foo/play-services-tasks/classes.jar"
bar=`cygpath -w "$foo/play-services-tasks/classes.jar"`
echo $bar

Запуск, который приводит к следующему (обратите внимание на двоеточие после буквы диска):

C:\svn\Projects\Client Config\Android\Repack\foo\out\play-services-tasks\classes.jar
C \svn\Projects\Client Config\Android\Repack\foo\out\play-services-tasks\classes.jar

Таким образом, путь (вывод cygpath) является правильным до помещения его в переменную, но переменная больше не содержит двоеточие после буквы диска. Это, в свою очередь, приводит к сбою другого скрипта / инструмента, когда он пытается перебрать пути в переменной через пробел. И, к сожалению, у этого инструмента ожидаются пути в стиле Windows.

Излишне говорить, что я сбит с толку ...

Проблема возникла, когда скрипт сборки изменился, и в нем могут отсутствовать некоторые хаки совместимости с Cygwin, некоторые из которых мне уже удалось применить, но этот действительно противный. Возможно, можно как-то обойти измененные части, но я бы предпочел выяснить, в чем причина моего открытия и как с этим справиться напрямую.

1 ответ1

1

Проблема появилась, когда изменился скрипт сборки, и в нем отсутствовали некоторые хаки совместимости с Cygwin, некоторые из которых мне уже удалось применить, прежде чем я воспользовался этим.

В конце концов мне удалось выяснить настоящего виновника, который заключался в том, что в скрипте сборки была функция, которая (при переборе по переменной PATH) устанавливала переменную среды IFS=: и впоследствии не сбрасывала ее. Поскольку bash использует эту переменную для разделения строк на поля, она также расширяет переменные, когда используют переменные без кавычек. Итак, исправление состояло в том, чтобы сделать SAVEIFS="$IFS" перед переустановкой IFS а затем затем установить обратно значение IFS=$SAVEIFS . В качестве альтернативы, как любезно объяснил Гордон Дэвиссон, я мог бы убедиться, что переменные всегда использовались в двойных кавычках (например, echo "$bar" вместо echo $bar).

Проблема решена, на самом деле не связана с Cygwin каким-либо иным образом, кроме использования двоеточий для разных целей в Windows и Cygwin, и, следовательно, иногда возникает необходимость прикоснуться к внутренней переменной разделителя полей. По этой единственной причине я решил оставить это здесь, на случай, если кто-то столкнется с подобной проблемой. Есть также много хороших вещей по всем аспектам расширения оболочки на USE.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .