set
是一个内置的shell,用于设置和取消设置shell选项和位置参数。
不带参数的情况下,set
将打印按当前语言环境排序的所有shell变量(环境变量和当前会话中的变量)。
您还可以阅读bash文档。
有一些警告。
set "$var"
将分配var
值$1
。如果$var
以-
或开头+
,则将$var
内容视为外壳程序选项的序列。如果$var
包含任何无效的选项,大多数POSIX外壳程序将显示错误。yash
而zsh
在sh
,ksh
仿真不仅印刷错误,但也设置有效的选项。当yash
停止在第一个无效选项上设置选项时,zsh
将分配所有这些选项。在yash
:
var=-fxd; set "$var"
f
并且x
将呈现$-
,而:
var=fdx; set "$var"
仅存f
在于中$-
。在这两种情况下,f
并且x
将介绍$-
与zsh
在sh
和ksh
仿真。
为了保护您免受这种情况的侵害,您可以将--
第一个参数传递为设置位置参数,即使它以-
或开头+
:
var=-fdx; set -- "$var"
将分配$var
给$1
,无论其内容如何。
set --
如果没有其他任何参数,则将取消设置所有位置参数。
如果第一个参数是-
,则行为未指定。所有已知的POSIX Shell都将取消设置x
和v
选项(除外posh
),并在-
位置参数之后分配任何内容:
set -xv - -f
将分配-f
给$1
。set -
也没有设置位置参数。Schily osh也表现得像那样。传家宝sh不设置v
和x
选项。
唯一的POSIX shell异常是yash
,它被-
视为第一个位置参数:
$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx
如果-
出现参数,Schily甚至不采取任何行动:
$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s
$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs