Perintah Windows menangkap keluaran skrip bash dalam satu langkah

4

Saya punya skrip 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)

Saya memicu skrip bash dari command prompt Windows.

postCloneSetup.sh

Ini membuka jendela lain dan kemudian kembali. Jendela yang dimunculkannya tetap terbuka dan mencatat teks keluaran.

masukkan deskripsi gambar di sini

Saya ingin menangkap output dari jendela spawned (teks yang ditulis ke konsol) dan mengembalikannya ke command prompt Windows.

Saya lebih suka menggunakan sesuatu seperti

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

untuk prompt perintah Windows.

Saya lebih suka tidak mengubah postCloneSetup.sh. Saya tahu saya bisa membuatnya menulis ke file dengan

exec &> postCloneSetupLog.log

tapi kemudian saya harus menunggu dan menjalankannya secara manual

type postCloneSetupLog.log

untuk melihat output di konsol. Ini tidak mungkin untuk diintegrasikan ke dalam mesin CI, yang merupakan tujuan saya.

Bagaimana saya bisa menangkap output dari konsol yang dihasilkan dalam satu perintah?

Scott H
sumber
1
Harap edit pertanyaan dan sertakan konten kedua skrip.
DavidPostill
@ DavidPostill Saya menambahkan konten postCloneSetup.sh, tetapi "skrip" lainnya hanya menjalankannya dari command prompt Windows. Di mesin CI itulah yang terjadi.
Scott H
Jendela kecil tampaknya menjadi program 'git for windows'. Lihat perintah redirection :: en.wikipedia.org/wiki/Redirection_(computing)
Biswapriyo
Tolong jelaskan apa yang Anda maksud dengan "Saya ingin menangkap output dari jendela spawned dan mengembalikannya ke command prompt Windows." Jangan merespons dalam komentar; edit pertanyaan Anda untuk membuatnya lebih jelas dan lebih lengkap.
G-Man

Jawaban:

2

Jawaban singkat:

Untuk menggunakan Git Bash, dan jalankan

  • "%ProgramFiles%\Git\bin\bash.exe" script_name.sh untuk menjalankan skrip
  • "%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'" untuk menjalankan satu-liner

Konteks:

Saya menemukan pertanyaan ini ketika mencari solusi untuk sesuatu yang serupa. Dalam pengaturan kami, kami menggunakan Git Bash di Windows (khususnya saat ini "GNU bash, versi 4.4.19 (1) -release (x86_64-pc-msys)") sebagai bagian dari lingkungan pengembangan untuk Windows, kami memiliki beberapa skrip yang ingin kami uji melalui GitLab CI persis di lingkungan ini: untuk mengeksekusi mereka di bawah Git Bash, dan melihat output dalam pekerjaan CI.

Apa yang berhasil bagi kami adalah mengeksekusi di "%ProgramFiles%\Git\bin\bash.exe" script_name.shmana "script_name.sh" adalah skrip yang akan dieksekusi oleh bash (atau jika Anda perlu mengeksekusi hanya perintah inline "%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'"). Output dari skrip ini terlihat di jendela CMD, dan ditangkap oleh pekerjaan CI.

Mungkin hasil yang serupa dapat dicapai dengan Windows Subsystem untuk Linux, tetapi karena Git Bash adalah persyaratan kami, kami tidak menyelidiki bagaimana hal itu dapat dilakukan dengan WSL.

Jadi, solusi / solusi yang saya usulkan dari pengalaman saya adalah menginstal "Git For Windows" https://gitforwindows.org/ (Git Bash adalah bagian dari itu), dan menjalankan skrip bash melalui Git Bash seperti dijelaskan di atas.

Topik Starter disebutkan bahwa menjalankan script dari CI adalah persis tujuannya (quote: but the other "script" is just running it from the Windows command prompt. In the CI engine that is what is happening, Link ), dan itu kasus kita gunakan juga, jadi saya menambahkan contoh konfigurasi CI pekerjaan (GitLab CI dalam kasus kami," .gitlab -ci.yml "). Adalah penting untuk membuat semua yang lolos benar untuk membuatnya bekerja, dan kami butuh beberapa kesalahan untuk melakukannya dengan benar:

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
ahli nujum
sumber