【问题标题】:bash script/pgrep not working as expectedbash 脚本/pgrep 未按预期工作
【发布时间】:2012-02-20 16:32:59
【问题描述】:

我有一个 bash 脚本,它尝试使用参数调用 pgrep(过度简化):

PATTERN="'/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf\$'"
pgrep -f $PATTERN
echo pgrep -f $PATTERN

给出以下输出:

Usage: pgrep [-cflvx] [-d DELIM] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
        [-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]
pgrep -f '/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf$'

我想这意味着参数没有传递给 pgrep,而是由于某种原因传递给了 echo。

我的期望:

7632
pgrep -f '/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf$'

当我自己运行 preg 行时,它按预期输出 7632。

我在这里做错了吗?我尝试过使用 sh、dash 和 bash。同样的结果,我真的看不出问题。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    您需要用双引号将 PATTERN 括起来:

    PATTERN="/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf\$"
    pgrep -f "$PATTERN"
    

    见:quoting variables

    编辑: 并且为了回显我会这样做:

    echo pgrep -f \'$PATTERN\'
    

    【讨论】:

    • +1 用于双引号和从模式字符串中删除单引号。但是,您可能也应该指出第二个变化。
    • 编辑:抱歉,stackoverflow 提交了我的评论而不是插入换行符...您的解决方案有效,谢谢!您能否向我解释为什么 '' 在提示符下运行命令时有效,但在我的脚本中它需要 "" ?谢谢
    • @alex:发生这种情况是因为PATTERN 在赋值后不包含文字引号符号(它们宁愿表示整个表达式是单个字符串);要继续将此表达式视为单个字符串,您需要明确引用它。
    【解决方案2】:

    由于我没有可用于测试的 lighttpd.bin,因此我提交了一个未经测试的选项,主要同意 @barti_ddu,但略有不同

    PATTERN='/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf\$'
    pgrep  -f "$PATTERN"
    echo pgrep  -f "$PATTERN"
    

    我会在对 PATTERN 的分配中保留单引号,但完全同意您在使用 pgrep 或 echo 时需要 dbl 引用。

    我希望这会有所帮助。

    【讨论】:

    • 显示的来自pgrep 的使用消息包括-f,没有任何参数。
    猜你喜欢
    • 2022-07-20
    • 2016-09-07
    • 2015-10-24
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    相关资源
    最近更新 更多