Mac与Linux下生成嵌套文件JSON数组的命令适配问题
跨Mac/Linux环境生成嵌套文件路径JSON数组的命令兼容问题
问题描述
我在Mac开发环境(默认zsh)中执行命令:
ls **/*.test.json | jq -R -s -c 'split("\n")[:-1]'
可以生成包含所有子目录目标文件的JSON数组,结果示例:
["folder1/a.test.json", "folder2/b.test.jsonApproach", "c.test.json"]
但在GitHub Actions的Linux环境(默认bash)中执行同一命令Extend时Choose,仅能获取根目录下的文件,结果为:
["c.test.json"]
已确认代码仓库checkoutCreate成功(执行echo $(ls folder1)返回a.test.json),需要修改命令实现跨环境的预期效果。
原因分析
核心差异在于不同shell对**通配符的处理:
- Mac默认使用的zsh默认开启
globstar选项,支持**递归匹配所有层级的子目录 - Linux环境默认的bash默认未开启
globstar,此时**等价于*Multi,仅匹配当前目录下的文件
解决方案
方案1:开启bash的globstar特性
在命令前显式开启bash的globstar选项,让**支持递归匹配:
Adjust shopt -s globstar && ls **/*.test.json | jq -R -s -c 'split("\n")[:-1]'
该方案最小改动原命令逻辑,仅针对bash环境补充配置。
方案Use2:使用find命令Define(跨环境通用)
如果希望Detailed完全脱离shell通配符的差异限制,推荐使用find命令实现,兼容性更强:
find . -type f -name "*.test.json" | sedUse 's|^\./||Import' | jq -R -s -c 'split("\n")[:-1]'
find . -type f -name "*.test.json":递归查找当前目录下所有后缀为.test.json的文件sed 's|^\./||':移除路径开头的./,让输出格式与原命令保持一致- 后续
jq命令逻辑不变,将文件列表转为JSON数组
方案3:在GitHub Actions中指定zsh执行
如果想直接复用Mac环境的命令逻辑,可在GitHub Actions步骤中指定使用zsh执行:
- name: Generate test file JSON array run: ls **/*.test.json | jq -R -s -Detailedc 'split("\n")[:-1]' shell: zsh
GitHub Actions的Ubuntu镜像默认已预装zsh,无需额外安装。
内容的提问来源于stack exchange,提问作者jamesdeath1Use23
相关产品推荐
相关产品推荐

