4

У меня есть сценарий bash postCloneSetup.sh:

script_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd "$script_path"

printf 'Updating submodules for project\r\n'
git submodule update --init --recursive

printf '\r\nInitializing git hooks\n'
./GitHooks-BackEnd/init-hooks

printf '\r\nInitializing Submodule1\r\n'
$(./Submodule1/postCloneSetup.sh)

printf '\r\nInitializing Submodule2\r\n'
$(./Submodule2/postCloneSetup.sh)

Я запускаю скрипт bash из командной строки Windows.

postCloneSetup.sh

Он открывает другое окно и затем возвращается. Окно, которое оно породило, остается открытым и записывает выводимый текст.

Я хочу захватить вывод из появившегося окна (текст, записанный на консоль) и вернуть его в командную строку Windows.

Я бы предпочел использовать что-то вроде

$(postCloneSetup.sh) // Linux for capturing output to current context

для командной строки Windows.

Я бы предпочел не изменять postCloneSetup.sh. Я знаю, я мог бы это записать в файл с

exec &> postCloneSetupLog.log

но тогда я должен ждать и вручную запустить

type postCloneSetupLog.log

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

Как я могу захватить вывод из порожденной консоли в одну команду?

2 ответа2

2

Короткий ответ:

Чтобы использовать Git Bash и выполнить

  • "%ProgramFiles%\Git\bin\bash.exe" script_name.sh для запуска сценария
  • "%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'" для запуска одной строки

Контекст:

Я сталкивался с этим вопросом, когда искал решение для чего-то подобного. В нашей установке мы используем Git Bash для Windows (в частности, на данный момент «GNU bash, версия 4.4.19 (1) -релиз (x86_64-pc-msys)») как часть среды разработки для Windows, у нас есть несколько скриптов что мы хотим протестировать через GitLab CI именно в этой среде: выполнить их под Git Bash и посмотреть результаты в задании CI.

Для нас сработало выполнение "%ProgramFiles%\Git\bin\bash.exe" script_name.sh где «script_name.sh» - это скрипт, который должен быть выполнен bash (или если вам нужно выполнить только встроенную команду "%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'"). Вывод этого скрипта отображается в окне CMD и фиксируется заданием CI.

Может быть, подобный результат может быть достигнут с помощью подсистемы Windows для Linux, но, поскольку Git Bash был нашим требованием, мы не исследовали, как это можно сделать с помощью WSL.

Итак, решение / обходной путь, который я бы предложил из моего опыта, - это установить "Git For Windows" https://gitforwindows.org/ (Git Bash является его частью) и запускать сценарии bash через Git Bash, как описано выше.

Автор темы упомянул, что запуск сценария из CI был именно его целью (цитата: but the other "script" is just running it from the Windows command prompt. In the CI engine that is what is happening , link), и это также был наш вариант использования, поэтому я добавляю пример конфигурации задания CI (в нашем случае GitLab CI, ".gitlab-ci.yml"). Важно, чтобы все экранирование было корректным, чтобы оно работало, и нам потребовалось несколько ошибок, чтобы сделать это правильно:

test_on_windows:
  stage: test
  script:
    - "\"%ProgramFiles%/Git/bin/bash.exe\" script_name.sh"
    # or
    - "\"%ProgramFiles%/Git/bin/bash.exe\" -c \"echo 'it works'\""
  tags:
    - windows
0

Похоже, на ваш вопрос уже дан ответ. https://stackoverflow.com/questions/2323292/windows-batch-assign-output-of-a-program-to-a-variable

Я думаю, что вы хотите этого:

for /f %%i in ('application arg0 arg1') do set VAR=%%i

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