在man bash中,提到set
有两个选项-
和--
我想知道在设置位置参数时使用-
和--
作为set
选项时是否存在任何差异。
当谈到他们在设置位置参数时的使用时,我找不到man bash中提到的任何重大差异。
答案 0 :(得分:8)
使用--
(双减号)表示shell选项的结束和参数的开始。因此,例如:
set -- -a -b -f somefile
在此之后,$1
为-a
,$2
为-b
,$3
为-f
,$4
为{{ 1}}。
如果没有somefile
,shell会将--
,-a
和-b
解释为shell选项,并将-f
设置为$1
Bash(4.1)手册说(somefile
):
set
如果此选项后面没有参数,那么位置参数 没有设定。否则,位置参数设置为参数, 即使其中一些以“--
”开头。
-
表示选项的结束,导致所有剩余的参数 分配给位置参数。 “-
”和“-x
”选项 被关掉了。如果没有参数,则为位置参数 保持不变。
答案 1 :(得分:2)
约定是对单个字母的参数使用单个-
,例如-i
{和} --
为他们的措辞完整的对手,例如--interactive
。
有关详细信息,请参阅here。
StackExchange网络上已经很好地回答了elsewhere。
<强>更新强>
双击--
前缀为命令的长(逐字)选项,但当与Bash内置(如set
)一起使用时,它表示该特定命令的选项结束。
E.g。如果要创建以短划线开头的文件:
touch -dashed
...你会收到错误:
touch: illegal option -- h
usage: touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...
然而,请尝试使用--
,等等瞧:
touch -- -dashed
...然后ls
查看当前目录中的-dashed
。
有关详细信息,请参阅here。
答案 2 :(得分:2)
4.1.5(1)的bash(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 -x
更为常见,set -v
中set -x
经常用于调试脚本以查看正在运行的命令。通常在调试shell脚本时,您可以使用bash -x <script>
运行它。知道set - ...
关闭了-x
,您可能想要使用set -- ...
,因为将-x
作为另一个命令的副作用关闭会非常意外
答案 3 :(得分:1)
在我的bash
联机帮助页中,有一句话:An argument of - is equivalent to --
。