答案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.