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

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

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

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

变量以允许在执行或获取行时设置它们的语法显示。

bash 手册页:

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

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

答案2

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

如果不带参数,set将打印按当前顺序排序的所有 shell 变量(包括环境变量和当前会话中的变量)语言环境

您还可以阅读bash 文档


有一些注意事项。

set "$var"var赋值给$1.如果以或$var开头,则内容将被视为 shell 选项序列。如果包含任何无效选项,大多数 POSIX shell 将打印错误。在中,仿真不仅打印错误,而且设置有效选项。当停止在第一个无效选项上设置选项时,将分配所有选项。在:-+$var$varyashzshshkshyashzshyash

var=-fxd; set "$var"

f并将x出现在$-, 同时:

var=fdx; set "$var"

仅存f在于$-.在这两种情况下,fx都会出现$-在和仿真zsh中。shksh

为了避免出现这种情况,您可以--作为第一个参数传递来设置位置参数,即使它以-or开头+

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

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

set --没有任何进一步的参数将重置所有位置参数。

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

set -xv - -f

将分配-f$1.set -也没有取消设置位置参数。希利奥什也有这样的行为。传家宝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

希利什-如果参数中存在if ,甚至什么也不做:

$ 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

答案3

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

男人狂欢多次提到它,但更容易链接到在线文档

这个内置函数非常复杂,值得单独专门一节。 set 允许您更改 shell 选项的值并设置位置参数,或显示 shell 变量的名称和值。

set 的调用规范为:

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

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

/set.*abef

答案4

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

实际上,由于setbash 本身是内置的,因此您可以访问 bash 的帮助手册而不是手册页。为此,您可以help在本例中使用 或help set

相关内容