BASH从字符串变量扩展大括号

时间:2017-12-30 06:52:32

标签: bash zsh

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

#!/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})

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

1 个答案:

答案 0 :(得分: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命令,然后我eval来处理第二次扩展。 (我冒昧地将路径更改为在典型系统上匹配的内容,因此如果您尝试测试,请确保将其更改回来。)

如果您不能信任输入,那么动态生成代码总是很危险的。这主要是命令注入攻击的工作方式。但是在你自己的shell中使用eval和可信输入或多或少是安全的#34;虽然我很少发现自己使用它,除非在像你这样的人为场景中,或者我自己的一些更糟糕的想法