V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dangyuluo
V2EX  ›  Bash

如何去除 Bash variable expansion 后加的单引号?

  •  
  •   dangyuluo · 2021-06-30 14:42:17 +08:00 · 644 次点击
    这是一个创建于 1002 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例子如下

    $ set -x # enable debug output from bash
    $ export PYTEST_FLAG='--pytest-args -k "not (xmllint or pclint)"';
    $ pytest ${PYTEST_FLAG}
    + pytest --pytest-args -k '"not' '(xmllint' or 'pclint)"' # this line is the debug output
    ... error
    

    从第四行可以看出,本来"not (xmllint or pclint)"应该作为一个字符串传递给pytest命令,但是 bash 在 variable expansion 后把"not, (xmllintpclint)" 用单引号圈了起来,似乎因为他们含有一些特殊字符?如何阻止 bash 这种行为呢?谢谢

    我最终想要 Bash 执行的命令为:

    $ pytest --pytest-args -k "not (xmllint or pclint)"
    
    4 条回复    2021-06-30 23:26:00 +08:00
    AoEiuV020
        1
    AoEiuV020  
       2021-06-30 14:52:23 +08:00
    叠个 bash,
    bash -c "pytest ${PYTEST_FLAG}"
    xuboying
        2
    xuboying  
       2021-06-30 14:53:09 +08:00
    declare -a PYTEST_FLAG=(--pytest-args -k "not (xmllint or pclint)")
    pytest "${PYTEST_FLAG[@]}"

    建议了解一下 shellcheck
    zbinlin
        3
    zbinlin  
       2021-06-30 21:03:04 +08:00
    这样?

    eval pytest "${PYTEST_FLAG}"
    dangyuluo
        4
    dangyuluo  
    OP
       2021-06-30 23:26:00 +08:00
    谢谢,eval 和`bash -c`都不被允许。

    @xuboying 不错!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1021 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:33 · PVG 03:33 · LAX 12:33 · JFK 15:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.