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

Ale*_*lev 27 bash 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"
}
Run Code Online (Sandbox Code Playgroud)

它是什么,它来自哪里?

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

jll*_*gre 21

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

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

bash 手册页

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

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

  • 那是因为 `ksh` 不会在 shell 变量中存储函数定义。 (4认同)
  • @cuonglm dgk 做出的明智设计决定!;-) (4认同)

cuo*_*glm 8

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

没有参数,set将打印在当前locale 中排序的所有 shell 变量(环境变量和当前会话中的变量)。

您还可以阅读bash 文档


有一些注意事项。

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

var=-fxd; set "$var"
Run Code Online (Sandbox Code Playgroud)

f并将x出现在 中$-,而:

var=fdx; set "$var"
Run Code Online (Sandbox Code Playgroud)

仅存f在于$-. 在这两种情况下,fx将出现在$-zshshksh仿真。

为了保护您免受这种情况的影响,您可以--作为第一个参数传递来设置位置参数,即使它以-or开头+

var=-fdx; set -- "$var"
Run Code Online (Sandbox Code Playgroud)

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

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

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

set -xv - -f
Run Code Online (Sandbox Code Playgroud)

将分配-f$1. set -也没有取消设置位置参数。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
Run Code Online (Sandbox Code Playgroud)

如果-出现在参数中,Schily sh甚至什么都不做:

$ 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
Run Code Online (Sandbox Code Playgroud)


use*_*275 8

因为set有输出并which set没有返回任何你知道它是你正在使用的 shell 的一部分,可能是 bash。

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

这个内置函数非常复杂,值得拥有它自己的部分。set 允许您更改 shell 选项的值和设置位置参数,或显示 shell 变量的名称和值。

set 具有以下调用规范:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]
Run Code Online (Sandbox Code Playgroud)

所以如果你想在命令行上的 man 中找到它,你可以搜索

/set.*abef
Run Code Online (Sandbox Code Playgroud)