Polecenie przechwytywania wiersza poleceń skryptu systemu Windows w jednym kroku

4

Mam skrypt 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)

Uruchamiam skrypt bash z wiersza polecenia systemu Windows.

postCloneSetup.sh

Otwiera kolejne okno, a następnie powraca. Okno, które zrodziło, pozostaje otwarte i rejestruje wyjściowy tekst.

enter image description here

Chcę przechwycić dane wyjściowe z okna spawnowanego (tekst zapisany w konsoli) i zwrócić go do wiersza polecenia systemu Windows.

Wolałbym użyć czegoś takiego

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

w wierszu polecenia systemu Windows.

Wolałbym nie modyfikować postCloneSetup.sh. Wiem, że mógłbym napisać do pliku za pomocą

exec &> postCloneSetupLog.log

ale potem muszę poczekać i ręcznie uruchomić

type postCloneSetupLog.log

aby zobaczyć wyjście w konsoli. Nie jest to możliwe do zintegrowania z silnikiem CI, co jest moim celem.

Jak mogę przechwycić dane wyjściowe z utworzonej konsoli w jednym poleceniu?

Scott H
źródło
1
Proszę edytować pytanie i włącz zawartość obu skryptów.
DavidPostill
@DavidPostill Dodałem zawartość postCloneSetup.sh, ale inny „skrypt” uruchamia go z wiersza polecenia systemu Windows. To właśnie dzieje się w silniku CI.
Scott H
Małe okno wydaje się być programem „git for windows”. Zobacz przekierowanie poleceń :: pl.wikipedia.org/wiki/Redirection_(computing)
Biswapriyo
Wyjaśnij dokładnie, co masz na myśli, mówiąc: „Chcę przechwycić dane wyjściowe z utworzonego okna i przywrócić je do wiersza polecenia systemu Windows”. Nie odpowiadaj w komentarzach; edytować Twoje pytanie, aby było jaśniejsze i bardziej kompletne.
G-Man

Odpowiedzi:

2

Krótka odpowiedź:

Aby użyć Git Bash i wykonać

  • "%ProgramFiles%\Git\bin\bash.exe" script_name.sh uruchomić skrypt
  • "%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'" biegać jeden liner

Kontekst:

Natknąłem się na to pytanie, szukając rozwiązania dla czegoś podobnego. W naszym ustawieniu używamy Git Bash na Windows (szczególnie w tej chwili „GNU bash, wersja 4.4.19 (1) -release (x86_64-pc-msys)”) jako część środowiska programistycznego dla Windows, mamy kilka skryptów że chcemy przetestować za pomocą GitLab CI dokładnie w tym środowisku: wykonać je w Git Bash i zobaczyć dane wyjściowe w zadaniu CI.

To, co dla nas pracowało, to wykonać "%ProgramFiles%\Git\bin\bash.exe" script_name.sh gdzie „nazwa_skryptu.sh” to skrypt, który ma być wykonywany przez bash (lub jeśli musisz wykonać tylko polecenie wbudowane "%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'" ). Wynik tego skryptu jest widoczny w oknie CMD i jest przechwytywany przez zadanie CI.

Być może podobny rezultat można osiągnąć dzięki podsystemowi Windows dla systemu Linux, ale ponieważ Git Bash był naszym wymaganiem, nie zbadaliśmy, jak można to zrobić z WSL.

Rozwiązaniem / obejściem, które zaproponowałbym z mojego doświadczenia, jest zainstalowanie „Git For Windows” https://gitforwindows.org/ (Git Bash jest jego częścią) i uruchamiaj skrypty bash za pomocą Git Bash, jak opisano powyżej.

Autor tematu wspomniał, że uruchomienie skryptu z CI było dokładnie jego celem (cytat: but the other "script" is just running it from the Windows command prompt. In the CI engine that is what is happening, połączyć ), i to był również nasz przypadek użycia, więc dodam przykład konfiguracji zadania CI (w naszym przypadku GitLab CI, „.gitlab-ci.yml”). Ważne jest, aby wszystkie ucieczki były poprawne, aby działały, a wykonanie tego zabrało nam kilka błędów:

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
augur
źródło