Saída de captura de prompt de comando do Windows do script bash em uma única etapa

4

Eu tenho um script 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)

Eu disparo um script bash a partir do prompt de comando do Windows.

postCloneSetup.sh

Abre outra janela e depois retorna. A janela gerada permanece aberta e registra o texto de saída.

Eu quero capturar a saída da janela gerada (o texto gravado no console) e retorná-la ao prompt de comando do Windows.

Eu preferiria usar algo como

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

para o prompt de comando do Windows.

Eu prefiro não modificar o postCloneSetup.sh. Eu sei que poderia gravar em um arquivo com

exec &> postCloneSetupLog.log

mas devo esperar e executar manualmente

type postCloneSetupLog.log

para ver a saída no console. Isso não é possível para integrar um mecanismo de CI, que é meu objetivo.

Como posso capturar a saída do console gerado em um comando?

    
por Scott H 13.06.2017 / 21:33

2 respostas

2

Resposta curta:

Para usar o Git Bash e executar

  • "%ProgramFiles%\Git\bin\bash.exe" script_name.sh para executar um script
  • "%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'" para executar one-liner

Um contexto:

Eu me deparei com essa pergunta ao procurar uma solução para algo semelhante. Em nossa configuração, usamos o Git Bash no Windows (especificamente no momento "GNU bash, versão 4.4.19 (1) -release (x86_64-pc-msys)") como parte do ambiente de desenvolvimento para Windows, temos alguns scripts queremos testar através do GitLab CI exatamente neste ambiente: executá-los no Git Bash e ver a saída no trabalho do IC.

O que funcionou para nós é executar "%ProgramFiles%\Git\bin\bash.exe" script_name.sh em que "script_name.sh" é um script a ser executado pelo bash (ou se você precisar executar apenas o comando inline "%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'" ). Uma saída desse script é visível na janela do CMD e é capturada pelo trabalho de IC.

Pode ser um resultado semelhante pode ser obtido com o Windows Subsystem para Linux, mas como o Git Bash era nossa exigência, não investigamos como isso poderia ser feito com o WSL.

Assim, uma solução / solução alternativa que eu proporia da minha experiência é instalar o link "Git For Windows" (Git Bash é uma parte e rodar scripts bash via Git Bash como descrito acima.

O Tópico Iniciante mencionou que a execução de um script do IC era exatamente o objetivo dele (citação: but the other "script" is just running it from the Windows command prompt. In the CI engine that is what is happening , link ), e esse também foi o nosso caso de uso, então estou adicionando um exemplo de configuração de tarefas de CI (GitLab CI in nosso caso, ".gitlab-ci.yml"). É importante obter todos os dados corretos para que funcione, e levamos alguns erros para fazer isso da maneira correta:

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
    
por 09.05.2018 / 21:53
0

Parece que sua pergunta já foi respondida. link

Eu acho que você quer isso:

for /f %%i in ('application arg0 arg1') do set VAR=%%i
    
por 16.07.2017 / 14:27