2015-01-27 3 views
1

Я работаю с файловыми файлами GNU в Windows на своей работе и стараюсь учиться, когда я иду. Рецепт линия, которая дает мне так много проблем являетсяПочему мои цитаты исчезают? (GNU make/sh)

$(SED) -n "/Format ID $(def_format_id)/,/End Format ID $(def_format_id)/ p" "$(def_format_altsec_header)" > "$(def_format_file)" 

которая не для C:/GNU1_06/bin/sed: -e expression #1, char 7: unterminated address regex.

Чтобы попытаться понять поведение, с которым я столкнулся в течение последних двух часов, я сменил его на простую команду, чтобы заставить sed запускать и останавливаться, чтобы я мог посмотреть, что именно происходит с процессом Process Исследователь:

$(SED) -e s/blah// 

ProcExp показывает, что make непосредственно вызывает sed с ожидаемой командной строкой. Однако, если вы указываете один аргумент, make вызывает ТОЧНО ту же самую вещь (никаких кавычек, которые можно найти в командной строке).

Все становится странно, когда вы используете двойные кавычки. Make invokes C:/GNU1_06/bin/sh.exe -c "C:/GNU1_06/bin/sed -e \"s/blah//\"" Пока все хорошо, но затем sh вызывает C:\GNU1_06\bin\sed.exe -e s/blah// как будто скрытых цитат никогда не было.

Что именно происходит здесь? Почему мои кавычки исчезают в преисподней, прежде чем sed когда-либо будет работать?

ОБНОВЛЕНИЕ: Это, по-видимому, связано с тем, что $ (SED) является полностью заданным путем. Такое поведение не наблюдается, когда sed.exe используется один (и ProcExp доказывает, что использует ту же копию sed, что и полностью заданный путь).

Эта проблема воспроизводит в минимальной Makefile

.PHONY: all 
all: 
    C:/gnu1_06/bin/sed.exe -n "/Format ID 01010101/,/End Format ID 01010101/ p" "./FORMAT/BIGHILO/AC/99/sff_altsec_01_data.h" 
+0

Можете ли вы включить вывод, который вы получаете при запуске? Кроме того, если вы используете Cygwin, Process Explorer может не показывать вам аргументы, используемые утилитами Cygwin. –

+0

Точная ошибка sed для первоначального отказа (первый код): C:/GNU1_06/bin/sed: -e выражение # 1, char 7: unterminated address regex –

+0

Можете ли вы добавить вывод make также, где он показывает команда, которую он выполняет? –

ответ

1

Когда сделать решает восстановить цель он расширяет рецепт, а затем передает каждую строку в результате отдельно к новому вызову в оболочке.

Кроме что, как оптимизация, нет необходимости передавать его в оболочку, когда линия не содержит мета-символы (т.е. символы, которые будут специально интерпретатором, такие вещи, как <, >, " , & и т.п.). В этом случае make просто выполняет прямую линию. AFAICT этот список не задокументирован.

Лично, когда на окнах я использую исключительно cygwin. Зачем? Потому что он гораздо более совместим во всех подобных случаях. Я когда-то попал в место с mingw, где не было 5 обратных косых черт, а 6 было слишком много. Тьфу!

Обратите также внимание, что синтаксический анализ в командной строке в Windows безумный. Когда echo, встроенный в cmd.exe, удаляет двойные кавычки? Поверьте мне, cygwin «just works» ™ (параллельное строительство стоит того, чтобы стоить в одиночку).

+0

Видимо, Cygwin не просто работает на него. –

+0

Да, Cygwin не просто работает. Тем не менее, наше распределение ужасно устарело, и мы, разработчики, часто сталкиваемся с ИТ и «если он не сломался, не путайте с ним!» над ним (особенно Perl). –

+0

Симпатии. Я сейчас застрял на svn 1.6 (и я могу тайно использовать 1.6.17). Я действительно скучаю за последние 3½ года разработки svn. И я думаю, что все дело в том, чтобы обновлять инструменты. – bobbogo

Смежные вопросы