使用“-”和“--”设置位置参数时选项的区别

4
在bash的man页中提到,set有两个选项--- 我想知道在设置位置参数时使用---作为set选项是否有任何区别。
当涉及到在设置位置参数时它们的使用时,我没有找到任何大的差异在bash的man页中被提到。

我不是很确定我理解这个问题。一般来说,许多命令行实用程序都有每个参数的两种形式。例如,对于特定的命令行实用程序,“-i”和“--interactive”可能意味着相同的事情。 - Steve
我理解那个,但那不是我的问题。请你查看一下 bash 的手册并找到设置选项,好吗? - Ankur Agarwal
4个回答

9

你可以使用--(双减号)来表示shell选项的结束和参数的开始。例如:

set -- -a -b -f somefile

在执行命令后,$1-a$2-b$3-f$4somefile

如果没有使用 --,shell 会将 -a-b-f 解释为 shell 选项,并将 $1 设置为 somefile

Bash(4.1)手册中说(关于 set 命令):

-- 如果此选项后没有跟随参数,则位置参数将被取消设置。否则,即使其中一些参数以 ‘-’ 开头,位置参数也将被设置为这些参数。

- 表示选项结束,导致所有剩余的参数都被分配给位置参数。‘-x’ 和 ‘-v’ 选项被关闭。如果没有参数,则位置参数保持不变。


感谢您引用bash manpage的内容。所以,“-”表示选项的结束,而不是“--”。如果我在您给出的示例中使用“-”,会有什么区别呢? - Ankur Agarwal
@abc:- 显然只是添加参数,并重置 -a-x-v - ninjalj

3

bash(1) man page 4.1.5(1) 中写道:

--      If no arguments follow this option, then the  positional
        parameters are unset.  Otherwise, the positional parame‐
        ters are set to the args, even if  some  of  them  begin
        with a -.
-       Signal  the  end of options, cause all remaining args to
        be assigned to the positional parameters.  The -x and -v
        options are turned off.  If there are no args, the posi‐
        tional parameters remain unchanged.

第一个区别是在 --- 后面没有参数时的情况。对于前者,现有的位置参数不会改变。对于后者,位置参数将被清除。
因此,set -- 会清除位置参数,而 set - 是无操作的。 -v-x 设置可以通过 set - ... 进行修改。因此,如果您已经打开了 set -v(它使Shell打印输入行),则 set - ... 命令将关闭它。而 set -- ... 不会改变它。 set -xset -v 更常见,因为 set -x 经常用于调试脚本以查看正在运行的确切命令。当调试Shell脚本时,通常会使用 bash -x <script> 命令来运行它。知道 set - ... 会关闭 -x,您可能想要使用 set -- ...,因为将 -x 关闭作为另一个命令副作用是非常意外的。

所以我猜在设置参数时使用它们之一没有区别。 - Ankur Agarwal
@abc:是的,有所不同。 set - ... 关闭 -x-v。这很可能会产生不良影响,因此我建议使用 set -- ... - camh

2
“惯例”是使用单个“-”表示单字母参数,例如“-i”,使用双“--”表示其完整单词形式的对应项,例如“--interactive”。更多信息请参见这里
在StackExchange网络的其他地方已经很好地回答了这个问题,请参考这里
“更新”:
双破折号“--”用于命令的长(逐字)选项前缀,但是当与Bash内置命令(如“set”)一起使用时,它表示该特定命令的选项结束。
例如,如果您想创建以破折号开头的文件:
touch -dashed

"你会收到一个错误:"
touch: illegal option -- h
usage: touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...

然而,试试加上--,就像这样:
touch -- -dashed

...然后在当前目录下输入ls以查看-dashed
更多信息请参见此处

不是我要问的,看看我的评论。 - Ankur Agarwal
哦,现在我明白了。你指的是 set Bash 内置命令。我会修改我的答案,并且修改你的答案使其更清晰明了。 - opyate
通常单字母参数的取值方式为 -a 5,而多于一个字母的参数的取值方式则使用等号 --after=5 - ahmet alp balkan

1
在我的手册中有这样一句话:-的参数等同于--

我有GNU bash,版本4.0.35(1)-release。它在手册的开头非常明确(第38行)。 - bmk
这与set不同,因为在调用bash之前没有参数(显然),而-a-v-x设置来自命令行。 - ninjalj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接