如何避免在 getopt 的`eval set ... "$@"` 中扩展单引号文本?
How to avoid expansion of single-quoted text in the `eval set... "$@"` for getopt?
我正在使用常规模式通过 getopt 执行参数解码:
function mytest {
eval set -- `getopt --options h --long help -- "$@"`
echo "1: 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 *
如何按预期进行评估?
因为你在 eval
中使用,所以除了禁用 globs(扩展发生在命令实际上是 运行 之前),我没有看到其他选项,即:
mytest ()
{
set -f # disable file name generation (globbing).
eval set -- $(getopt --options h --long help -- "${@}")
echo "1: 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:./*
引用您的扩展以防止通配:
function mytest {
eval set -- "`getopt --options h --long help -- "$@"`"
echo "1: 2:"
}
我正在使用常规模式通过 getopt 执行参数解码:
function mytest {
eval set -- `getopt --options h --long help -- "$@"`
echo "1: 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 *
如何按预期进行评估?
因为你在 eval
中使用,所以除了禁用 globs(扩展发生在命令实际上是 运行 之前),我没有看到其他选项,即:
mytest ()
{
set -f # disable file name generation (globbing).
eval set -- $(getopt --options h --long help -- "${@}")
echo "1: 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:./*
引用您的扩展以防止通配:
function mytest {
eval set -- "`getopt --options h --long help -- "$@"`"
echo "1: 2:"
}