bash 中 `set -k` 选项的实际用法

bash 中 `set -k` 选项的实际用法

我们什么时候set -k在 bash 中使用选项?

Bash 参考手册说,

赋值语句形式的所有参数都放置在命令的环境中,而不仅仅是命令名称之前的参数。

我理解该选项的作用,但无法想象我们何时需要它。

答案1

基本上,您可以随时使用它,将传递到 shell 脚本(作为参数)的环境变量“注入”,就好像它们是通过 环境变量设置的一样export,但不必export在运行命令之前将它们永久驻留在 的列表中。

笔记:还有-k开关的长形式,set -o keyword

例子

$ cat cmd1.bash 
#!/bin/bash

echo $VARCMD

现在如果我set -k

$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi

但如果我只是运行上面的脚本:

$ ./cmd1.bash 

$

出口是做什么的?

$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands.  If VALUE is supplied, assign VALUE before exporting.
...

因此,如果我们像这样添加export | grep VAR到我们的脚本中:

$ cat cmd2.bash 
#!/bin/bash

echo $VARCMD
export | grep VAR

我们再次运行上述测试:

$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"

但没有set -k

$ ./cmd2.bash 

$

set -k允许我们临时批量导出变量也是如此。

另一个例子

$ cat cmd3.bash 
#!/bin/bash

echo $VARCMD1
echo $VARCMD2
export | grep VAR

当我们设置多个变量时,它们都会被导出:

$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"

那么它只是注入所有的环境变量吗?

不,-k这里做了一件非常明确的事情。它仅导出执行命令时命令行中包含的变量。

例子

假设我设置了这个变量:

$ VARCMD1="hi"

现在,当我们运行相同的命令时省略VARCMD1="hi"

$  set -k; ./cmd3.bash VARCMD2="bye"; set +k

bye
declare -x VARCMD2="bye"

但为什么会存在这种情况呢?

我发现这个来源解释了一些关于此功能的信息,标题为:“关键字参数分配字符串”。笔记:源 URL 使用 IP 地址,因此我无法在 SE 上直接链接到它。

http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html

使用任何语言进行编程时,变量及其值传递对于编写可靠的代码至关重要。除了整数和数组变量类型之外,所有其他 shell 变量都接受字符串作为其值。在谈论 shell 编程语言时,为了保持一致,我们更喜欢使用“关键字参数”这一短语。为关键字参数赋值时需要注意以下几点:

  • 为了避免任何意外的影响,请始终将参数分配子字符串放在命令字符串前面。

    在 B shell 中,关键字参数的分配值将存储在(本地)shell 变量中。在 bash 和 ksh 中,命令前面的关键字参数赋值字符串不会存储在 shell 变量中。它们仅影响分叉以执行当前命令的直接子进程。一行关键字参数赋值字符串确实存储在(本地)shell 变量中。关键字参数赋值字符串也可能作为参数出现在 alias、declare、typeset、export、readonly 和 local 内置命令中。 [Bash 参考手册第 3.4 节]

  • 如果关键字参数赋值字符串位于命令名称之后,则它们将被视为要执行的命令的参数。

  • 关键字参数可以通过set命令来操作。

答案2

任何实际用法set -k都可能只是个人风格。有些人 - 也许那些喜欢在函数调用中提供使用关键字参数的编程语言的人,或者那些喜欢命令dd语法的少数人 - 可能更喜欢

设置-k
...
命令 var 1 =val 1 var 2 =val 2

var 1 =val 1 var 2 =val 2命令

该选项存在于某些 shell 中的实际原因在POSIX 标准中 set 命令的基本原理:

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.

相关内容