没有参数的set命令有什么作用?


22

set没有参数的命令有什么作用?

如我所见,它像env命令一样以字母顺序打印出我的环境变量。并进一步输出一些不同的信息(变量?函数?),例如:

__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

它是什么以及它来自哪里?

我找不到set没有参数的命令信息。实际上,我的Linux发行版中根本没有man页面set


1
“这个内建函数是如此复杂,以至于应有其应有的表现。” 见文档
galath '17

Answers:


17

set 是一个内置的shell,它显示所有shell变量,不仅显示环境变量,还显示shell函数,这是您在列表末尾看到的。

变量以一种语法显示,该语法允许在执行或来源行时对其进行设置。

bash 手册页

如果未提供任何选项或参数,则set将显示所有shell变量和函数的名称和值,这些变量和函数将根据当前语言环境进行排序,其格式可以重新用作设置或重置当前设置的变量的输入。

在不同的外壳上,行为不一定是相同的。例如,ksh set不显示外壳函数。


3
那是因为ksh不要将函数定义存储在shell变量中。
cuonglm '16

2
@cuonglm dgk做出了明智的设计决定!;-)
jlliagre

7

因为set具有输出并且不which set返回任何内容,所以您知道它是您正在使用的shell的一部分,可能是bash。

man bash多次提到它,但在在线文档中链接起来更容易。

这个内建函数是如此复杂,以至于它自己的部分。set允许您更改shell选项的值并设置位置参数,或显示shell变量的名称和值。

set具有以下调用规范:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

因此,如果您想在命令行上的man中找到它,可以使用

/set.*abef

which set取决于您的外壳。至少zsh会为您报告。您也可以阅读此内容以获取更多详细信息。
cuonglm '16

这个问题不太可能是关于bash的问题,因为它具有很大的市场支配地位,并且使用非默认Shell的任何人都不需要问这个问题。
user1133275 '01

6

set是一个内置的shell,用于设置和取消设置shell选项和位置参数。

不带参数的情况下,set将打印按当前语言环境排序的所有shell变量(环境变量和当前会话中的变量)。

您还可以阅读bash文档


有一些警告。

set "$var"将分配var$1。如果$var-或开头+,则将$var内容视为外壳程序选项的序列。如果$var包含任何无效的选项,大多数POSIX外壳程序将显示错误。yashzshshksh仿真不仅印刷错误,但也设置有效的选项。当yash停止在第一个无效选项上设置选项时,zsh将分配所有这些选项。在yash

var=-fxd; set "$var"

f并且x将呈现$-,而:

var=fdx; set "$var"

仅存f在于中$-。在这两种情况下,f并且x将介绍$-zshshksh仿真。

为了保护您免受这种情况的侵害,您可以将--第一个参数传递为设置位置参数,即使它以-或开头+

var=-fdx; set -- "$var"

将分配$var$1,无论其内容如何。

set -- 如果没有其他任何参数,则将取消设置所有位置参数。

如果第一个参数是-,则行为未指定。所有已知的POSIX Shell都将取消设置xv选项(除外posh),并在-位置参数之后分配任何内容:

set -xv - -f

将分配-f$1set -也没有设置位置参数。Schily osh也表现得像那样。传家宝sh不设置vx选项。

唯一的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

我永远无法理解为什么人们会链接到任何地方,但第一个...你可能要提到的不同set -- $unsetset - $unsetset $unset,和set "$unset"等-它通常是那些让人进入摆在首位的那种麻烦的差异。
mikeserv '16

@mikeserv:嗯,我添加了更多详细信息,但是使用时我没有明白你的意思$unset
cuonglm '16

@cuonglm该命令的set $unset作用与set未设置的变量完全相同。但是set "$unset" 请注意,如果unset实际上是一个未设置的变量。A set - $unset删除-v-x设置选项(以bash表示)。

@BinaryZebra:当然,对我来说,最好使用unset_var。还要注意,set "$unset"它实际上设置$1为空。那是关于shell扩展的,而不是严格的to set,所以我不提了。
cuonglm '16

1
@mikeserv:的行为posh,并yash有不同的时候-出现。您可以阅读我的更新内容(并随时进行改进)。
cuonglm '16

2

如果您正在bash shell中工作,请键入help set

在打印帮助的末尾,请阅读:

如果没有给出ARG,则会打印所有shell变量。

因此,无参数将set打印外壳程序已知的所有变量。


我想知道是否set -x; set会有所帮助
ILMostro_7 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.