【问题标题】:Twice Bash command substitution两次 Bash 命令替换
【发布时间】:2016-07-27 23:19:24
【问题描述】:

我有目录 a1..a5b1..b5c1..c5。在每个目录中,我有两个文件 a1b1c1

do mkdir /tmp/{a,b}$d; touch /tmp/{a,b,c}$d/{a,b,c}1; done;

我想在以“a”开头的目录中获取所有以“a”或“b”开头的文件。我可以这样做:

DIRS=`ls -1 -d /tmp/{a,b}*/a*`
echo ${DIRS}

并获得:

/tmp/a1/a1 /tmp/a2/a1 /tmp/a3/a1 /tmp/a4/a1 /tmp/a5/a1 /tmp/b1/a1 /tmp/b2/a1 /tmp/b3/a1 /tmp/b4/a1 /tmp/b5/a1

现在,我将使用一个名为 DATA 的变量来存储目录并稍后获取文件:

DATA="/tmp/{a,b}*"
echo ${DATA}
DIRS=`ls -1 -d ${DATA}/a*`
echo ${DIRS}

在输出中,DATA 内容正常 (/tmp/{a,b}*),但我收到以下错误:

ls: 无法访问 /tmp/{a,b}*/a*: 没有这样的文件或目录

知道为什么会这样吗?

【问题讨论】:

    标签: linux bash variables command-substitution


    【解决方案1】:

    我解决了这个问题,但我找不到任何关于我之前尝试失败的原因的参考资料。

    DATA="/tmp/{a,b}*"
    echo ${DATA}
    DIRS=`eval "ls -1 -d ${DATA}/a*"`
    echo ${DIRS}
    

    输出:

    /tmp/a1/a1 /tmp/a2/a1 /tmp/a3/a1 /tmp/a4/a1 /tmp/a5/a1 /tmp/b1/a1 /tmp/b2/a1 /tmp/b3/a1 /tmp/b4/a1 /tmp/b5/a1

    【讨论】:

    • 这是因为 glob 和大括号扩展不会发生在双引号或字符串赋值中,而 glob 扩展确实发生在分词之后。这意味着,如果您使用 echo somethingvar=something; echo $var,两者最终都会扩展 glob,但只有前者最终会扩展大括号。
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多