【问题标题】:bash brace expansion for PATH-like variables类 PATH 变量的 bash 大括号扩展
【发布时间】:2018-07-20 20:06:09
【问题描述】:

我需要像这样设置一个变量:

./configure ... PKG_CONFIG_PATH=/usr/local/opt/libxml2/lib/pkgconfig:/usr/local/opt/imagemagick/lib/pkgconfig:/usr/local/opt/gnutls/lib/pkgconfig

一个明显的方法是使用Brace Expansion

PKG_CONFIG_PATH=/usr/local/opt/{libxml2,imagemagick,gnutls}/lib/pkgconfig
PKG_CONFIG_PATH=${PKG_CONFIG_PATH// /:}

但是,这不起作用(大括号扩展不会发生在变量设置中,而且,当扩展 完成时,分隔符是一个 空格 并且有似乎没有办法改变这一点。

那么,有没有办法避免每个包显式前缀和后缀的丑陋?

【问题讨论】:

  • “分隔符是空格”?大括号扩展根本不会创建“空格”或任何其他字符;它创建 words,前缀和后缀内容重复。这些词是完全独立的 C 字符串;您没有包含文字空格的单个字符串,您有 单独的、独立的字符串,每个结果一个。这类似于 "${array[@]}" 不会在数组元素之间插入空格——而是将它们扩展为每个单词。
  • 这就是 chepner 的答案中的数组方法有效的原因——一个数组可以存储多个独立的字符串——以及为什么原始代码没有——因为你正在扩展为一个上下文(分配给一个标量/string-type 变量),其中多个字符串无效。

标签: bash brace-expansion


【解决方案1】:

假设这是一个脚本,而不是交互式使用,我只使用一个数组。

pkg_config_path=(
 /usr/local/opt/{libxml2,imagemagick,gnutls}/lib/pkgconfig
)
./configure ... PKG_CONFIG_PATH=$(IFS=:; printf %s "${pkg_config_path[*]}")

此时,您可能需要考虑是否需要大括号扩展并明确列出目录:

pkg_config_path=(
  /usr/local/opt/libxml2/lib/pkgconfig
  /usr/local/opt/imagemagick/lib/pkgconfig
  /usr/local/opt/gnutls/lib/pkgconfig
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2016-01-10
    • 1970-01-01
    相关资源
    最近更新 更多