从字符串变量扩展BASH大括号[重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

如何扩展最初来自字符串变量的大括号扩展?请注意,字符串变量是必需的。

#!/usr/bin/env bash

TEXT_DIRS='opt/*/{doc,gtk-doc}'

我的目的是从zsh或其他语言(如Perl或Python)读取bash源代码。从/etc/makepkg.conf获取配置,如下所示。

DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})

这完全是为了学习目的。这是可能的,从字符串扩展?

bash zsh
1个回答
1
投票

这里棘手的问题是,一旦Bash解析了环境变量,它就不会再次传递来处理其内容。您必须在shell的另一个传递中评估变量的内容(例如,另一个shell命令)。

这是一种方法:

bash-4.4# TEXT_DIRS='/usr/*/{bin,src,lib}'
bash-4.4# bash -c ls\ $TEXT_DIRS
ls: /usr/*/src: No such file or directory
/usr/local/bin:

/usr/local/lib:

在这里,我正在动态生成一个shell命令,然后我evaluate来处理第二次扩展。 (我冒昧地将路径更改为在典型系统上匹配的内容,因此如果您尝试测试,请务必将其更改回来)。

如果您不能信任输入,则动态生成代码总是很危险的。这实质上就是命令注入攻击的工作方式。但是在你自己的shell中使用eval和可信输入或多或少是“安全的”,尽管我很少发现自己使用它,除非在像你这样的人为场景或者我自己的一些更糟糕的想法中。

© www.soinside.com 2019 - 2024. All rights reserved.