Cygwin bash -c выдает разные argc в зависимости от того, начинается ли команда с c: / или что-то еще - PullRequest
4 голосов
/ 30 марта 2012

Я в приглашении Windows, т.е. cmd.exe; «camlprog» ничего не делает, только выводит свои аргументы (то есть argv), разделенные «\ n» (то есть каждый в своей строке).

Первый случай:

c:\> c:\cygwin\bin\bash -c "c:/cygwin/home/jonathan/camlprog \"foo\" bar"
c:\cygwin\home\jonathan\camlprog.exe
foo bar

Второй случай:

c:\> c:\cygwin\bin\bash -c "~/camlprog \"foo\" bar"
c:\cygwin\home\jonathan\camlprog.exe
foo
bar

Для меня первый случай определенно неверен: camlprog передается foo bar как единственный аргумент вместо двух отдельных foo и bar аргументов. Я предполагал, что это будет эквивалентно:

c:\> c:\cygwin\bin\bash
jonathan@host:$ c:/.../camlprog "foo" bar

который, конечно, печатает

foo
bar

Я что-то упустил? У кого-нибудь есть идея, что происходит?

Спасибо

1022 * Ионафан *

1 Ответ

1 голос
/ 10 мая 2012

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

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

Чтобы обеспечить это, создайте файл с именем test.bat в Windowsс этим содержанием:

@echo off
echo %1

И вызовите его, передав свой параметр:

C:\> test.bat "c:/cygwin/home/jonathan/camlprog \"foo\" bar"

В результате вы получите:

"c:/cygwin/home/jonathan/camlprog \"foo\" bar"

Что означает косые черты и вседругие символы передаются в сценарий.Итак, в вашем случае они передаются в bash, который обрабатывает эти символы для вас, и делает это каким-то непоследовательным образом.

Итак, чтобы обойти вашу проблему, вы можете вызвать командуway:

 c:\> c:\cygwin\bin\bash -c 'c:/cygwin/home/jonathan/camlprog "foo" bar'
 foo
 bar

Используя одинарные кавычки сначала, а потом двойные кавычки, скрипт camlprog, кажется, работает как ожидалось.

...