Как вызвать файл bat / cmd из Cygwin и наследовать переменные? - PullRequest
0 голосов
/ 02 февраля 2019

Предположим, у меня есть сценарий bat (или cmd), который устанавливает переменную среды:

rem set_foo.bat
SET foo=XXX

Я хочу вызвать этот сценарий из сценария Cygwin bash таким образом, чтобыпеременная, установленная set_foo.bat, видна скриптом Cygwin bash.То есть этот сценарий Cygwin bash:

#!/bin/sh
<call set_foo.bat in such a way that FOO becomes visible to this Cygwin script>
echo FOO is ${FOO}

должен напечатать:

FOO is XXX

Возможно ли это и как?

PS 1: Мне известно оПредлагаемые здесь решения: переменные окружения cygwin установлены в файле bat , и они НЕ являются тем, что я хочу.

PS 2: скрипт bat не находится под моим контролем (скрипт Cygwin bash)поэтому любое решение, предусматривающее настройку скрипта bat, неприемлемо.

PS 3: если я просто вызову set_foo.bat из скрипта Cygwin bash, как показано ниже:

#!/bin/sh
set_foo.bat
echo FOO is ${FOO}

, тогда значениеFOO не видно.То есть сценарий Cygwin bash печатает:

FOO is 

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Вот простой рабочий пример.Создайте cygwin сценарий оболочки (с LF для EOL)

:
# runner.sh
cmd=/cygdrive/c/Windows/system32/cmd.exe
$cmd /C wrapper.bat
diff env0.txt env1.txt | dos2unix | sed -e '/[0-9]/d' -e '/^> /s/> //'

и сценарий cmd (с CR / LF для EOL)

@rem wrapper.bat
@set > env0.txt
@call .\set_foo.bat
@set > env1.txt

и замену дляИсходный файл cmd (также с CR / LF для EOL)

@rem set_foo.bat
@set FOO=BAZ

Выполнение ./runner.sh из оболочки отобразит переменные среды, установленные файлом set_foo.bat cmd.Пока этот файл не использует команду setlocal, вы увидите все изменения среды в wrapper.bat.Это должно правильно отображать новые переменные среды.Обработка удалений или изменений оставляется читателю как упражнение, аналогично передавая аргументы.

HTH

0 голосов
/ 03 февраля 2019

Попробуйте:

#!/bin/sh

export $(cmd /c "set_foo.bat & set foo" | grep "^foo=")
echo Foo is $foo

Пока set_foo.bat не устанавливает значение %foo% в области действия setlocal, значение должно переноситься на половину & set foocmd.exe интерпретируемая команда.Это выведет пару переменная = значение, которую export будет интерпретировать как присваивание собственной переменной.

...