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.
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?
postCloneSetup.sh
, ale inny „skrypt” uruchamia go z wiersza polecenia systemu Windows. To właśnie dzieje się w silniku CI.Odpowiedzi:
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 linerKontekst:
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:źródło
Wydaje się, że twoje pytanie zostało już udzielone. https://stackover.com/questions/2323292/windows-batch-assign-output-of-a-program-to-a-variable
Myślę, że chcesz tego:
źródło