我有一个 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)
我从 Windows 命令提示符触发一个 bash 脚本。
postCloneSetup.sh
它打开另一个窗口然后返回。它生成的窗口保持打开状态并记录输出文本。
我想捕获生成的窗口的输出(写入控制台的文本)并将其返回到 Windows 命令提示符。
我更喜欢使用类似
$(postCloneSetup.sh) // Linux for capturing output to current context
用于 Windows 命令提示符。
我宁愿不修改 postCloneSetup.sh。我知道我可以把它写入一个文件
exec &> postCloneSetupLog.log
但我必须等待并手动运行
type postCloneSetupLog.log
在控制台中查看输出。这对于集成到 CI 引擎来说是不可能的,而这正是我的目标。
如何通过一个命令捕获生成的控制台的输出?
答案1
简短回答:
要使用 Git Bash,请执行
"%ProgramFiles%\Git\bin\bash.exe" script_name.sh
运行脚本"%ProgramFiles%\Git\bin\bash.exe" -c "echo 'it works'"
运行一行
背景:
我在寻找类似解决方案时遇到了这个问题。在我们的设置中,我们在 Windows 上使用 Git Bash(目前具体为“GNU bash,版本 4.4.19(1)-release (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 Subsystem for Linux 可以实现类似的结果,但由于我们的要求是 Git Bash,所以我们没有研究如何使用 WSL 来实现。
因此,根据我的经验,我建议的解决方案/解决方法是安装“Git For Windows”https://gitforwindows.org/(Git Bash 是其中的一部分),并按照上面所述通过 Git Bash 运行 bash 脚本。
主题发起者提到,从 CI 运行脚本正是他的目标(引述:but the other "script" is just running it from the Windows command prompt. In the CI engine that is what is happening
,关联),这也是我们的用例,所以我添加了一个 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
答案2
看来您的问题已经得到解答了。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