代码之家  ›  专栏  ›  技术社区  ›  Marcus

如何避免扩展“eval set”中的单引号文本。。。“$@”`用于getopt?

  •  1
  • Marcus  · 技术社区  · 6 年前

    我使用常规模式通过getopt执行参数解码:

    function mytest {
      eval set -- `getopt --options h --long help -- "$@"`
      echo "1:$1 2:$2"
    }
    

    但当我传递一个带引号的字符串时,它实际上是展开的,例如:

    $ mytest 'x * z'
    1:-- 2:<list of files from current dir>
    

    奇怪的是,似乎只有特定的结构 '<string> * <other_strings>' 触发行为;类似结构不会:

    $ mytest '* z'
    1:-- 2:* z
    $ mytest 'x *'
    1:-- 2:x *
    

    如何按预期执行评估?

    2 回复  |  直到 6 年前
        1
  •  2
  •   that other guy    6 年前

    引用您的扩展以防止全球化:

    function mytest {
       eval set -- "`getopt --options h --long help -- "$@"`"
       echo "1:$1 2:$2"
    }
    
        2
  •  0
  •   sKwa    6 年前

    因为您正在使用 eval ,因此,除了禁用globs(扩展发生在命令实际运行之前),我看不到其他选项,即:

    mytest ()
    {
        set -f    # disable file name generation (globbing).
        eval set -- $(getopt --options h --long help -- "${@}")
        echo "1:${1} 2:${2}"
        set +f
    }
    
    $ mytest x * z
    1:-- 2:x
    
    $ mytest 'x * z'
    1:-- 2:x * z
    
    $ mytest ./*
    1:-- 2:./config-err-reCeGT
    
    $ mytest "./*"
    1:-- 2:./*