gpt4 book ai didi

bash - 如何控制何时扩展glob,将glob从sh传递到bash脚本然后扩展它

转载 作者:行者123 更新时间:2023-12-05 04:25:29 25 4
gpt4 key购买 nike

我正在尝试在 CI 系统中运行一些代码

Bash 5 可用,但初始命令是从 sh

运行的

我想我需要 bash 特性

这会打印文字 **/*.json:

bash -c 'echo **/*.json'

这个有效:

bash -c 'shopt -s globstar; echo **/*.json'

这给出了“意外标记 `(' 附近的语法错误”:

bash -c 'shopt -s extglob; echo **/*.@(yml|yaml)'

我发现这个答案暗示了语法错误 https://stackoverflow.com/a/49283991/202168 的原因

globstar 在单行代码中很好,但同样不适用于 extglob,因为 blah blah 与解析器有关。

所以我尝试创建一个包装器脚本:

#!/usr/bin/env bash

shopt -s globstar
shopt -s extglob

exec "$@"

并调用它:

wrapper.sh 'echo **/*.@(yml|yaml)'

但好像 glob 没有展开,我得到“没有这样的文件或目录”。

或者:

wrapper.sh echo '**/*.@(yml|yaml)'

只是回显文字 **/*.@(yml|yaml)

和:

wrapper.sh echo **/*.@(yml|yaml)

再次给出“语法错误”,我假设是因为现在 sh 正试图在它到达 bash 包装器之前解析 glob 部分。

如何将 glob 传递到包装器脚本中,以便在调用 echo 之前在 bash 包装器中展开它?

(我正在寻找解决方案,而不是寻找列出 yml 或 yaml 文件的替代方法)

最佳答案

这应该有效(原因在您找到的答案中有解释):

bash -c 'shopt -s extglob globstar
echo **/*.@(yml|yaml)'

请注意单引号命令字符串中的文字换行符,而不是 ;

关于bash - 如何控制何时扩展glob,将glob从sh传递到bash脚本然后扩展它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73248630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com