如何在CLI中解析Bash脚本输出并提取Xcode测试结果文件路径
提取Xcode测试结果文件路径的正确方法
看起来你的脚本在捕获xcresult路径时犯了两个关键错误:一是变量赋值的管道写法逻辑不对,二是用cut命令无法获取目标行的下一行内容。咱们一步步来修正:
问题分析
你的原代码里这一行逻辑完全错误:
variable=RatioUITest.sh | grep 'Test session results, code coverage, and logs:'|cut -f2 -d 'T'
这里你不是在处理xcodebuild的输出,而是把字符串RatioUITest.sh赋值给变量后试图管道,根本得不到测试输出的内容。而且cut是切割当前行的文本,但你需要的是目标提示行的下一行的完整路径,这显然不是cut能完成的工作。
解决方案
我们需要先捕获xcodebuild的输出,然后定位到目标行,再提取它的下一行。下面是几种可靠的实现方式:
方式1:用grep + tail 获取下一行
这种方式最直观,先用grep找到目标行并带出下一行,再用tail只保留路径行:
#!/bin/bash echo Running RatiosUITests # 捕获xcodebuild的输出,同时保留终端打印(可选,想看到完整测试输出就保留) xc_output=$(xcodebuild \ test \ -project Ratios.xcodeproj \ -scheme RatiosUITests \ -destination 'platform=iOS Simulator,name=iPhone 13 mini') # 从输出中提取目标路径 result_path=$(echo "$xc_output" | grep -A1 'Test session results, code coverage, and logs:' | tail -n1) echo "测试结果路径:$result_path"
grep -A1表示匹配目标行后,额外输出后面1行内容tail -n1只保留这额外的一行,也就是我们要的xcresult路径
方式2:用sed直接定位并提取
sed可以直接定位到包含目标文本的行,然后跳转到下一行输出:
result_path=$(echo "$xc_output" | sed -n '/Test session results, code coverage, and logs:/{n;p}')
-n表示只输出我们指定的内容/目标文本/{n;p}:找到匹配的行后,n跳转到下一行,p打印该行内容
方式3:用awk处理(更灵活)
awk适合复杂文本处理,这里可以直接匹配目标行,然后读取并打印下一行:
result_path=$(echo "$xc_output" | awk '/Test session results, code coverage, and logs:/{getline; print}')
getline会读取下一行的内容,然后print输出它
完整可运行脚本
把上面的逻辑整合到你的脚本里,最终版本如下:
#!/bin/bash echo Running RatiosUITests # 执行测试并捕获所有输出(包括错误信息) xc_output=$(xcodebuild \ test \ -project Ratios.xcodeproj \ -scheme RatiosUITests \ -destination 'platform=iOS Simulator,name=iPhone 13 mini' 2>&1) # 提取结果路径(这里用sed的方式,你可以换成上面任意一种) result_path=$(echo "$xc_output" | sed -n '/Test session results, code coverage, and logs:/{n;p}') # 打印或后续使用路径 echo "获取到的测试结果路径:$result_path" # 示例:用xcrun处理结果文件 # xcrun xcresulttool get --path "$result_path"
注意加上2>&1是为了把标准错误输出也捕获进来,确保不会漏掉任何可能包含路径的内容。
内容的提问来源于stack exchange,提问作者Данил Кокин
相关产品推荐
相关产品推荐

