到底是什么功能“关键词set
" bash shell 上的命令分配的选项?
选项:
set -o keyword
或者
set -k
一个简单的例子就足以让我理解。
答案1
通常,要为命令注入环境变量,您可以在命令之前对名称进行赋值,如下所示:
VARIABLE=value bash -c 'echo "$1 $VARIABLE"' bash hello
这将运行bash -c 'echo "$VARIABLE"' bash hello
并设置为该命令环境中的VARIABLE
字符串。value
在这种情况下,该命令将打印hello value
(hello
来自内联脚本的第一个命令行参数,并且value
来自环境变量)。
使用set -o keyword
(或set -k
) in bash
(这是一个非标准 shell 选项),允许在命令行的任何位置进行赋值:
$ set -k
$ bash -c 'echo "$1 $VARIABLE"' bash hello VARIABLE=value
hello value
$ bash -c 'echo "$1 $VARIABLE"' bash VARIABLE=value hello
hello value
$ bash -c 'echo "$1 $VARIABLE"' VARIABLE=value bash hello
hello value
$ bash -c VARIABLE=value 'echo "$1 $VARIABLE"' bash hello
hello value
$ bash VARIABLE=value -c 'echo "$1 $VARIABLE"' bash hello
hello value
我从未见过这个选项在“野外”使用,并且我假设它只在非常特定的情况下很少使用,因为它从根本上改变了命令的解析方式。
答案2
从手册:
-k
赋值语句形式的所有参数都放置在命令的环境中,而不仅仅是命令名称之前的参数。
经过一些实验:
$ bash -c '
env | grep -e foo -e baz
for ((i=0; i<=$#; i++)); do echo "$i = ${!i}"; done
' foo=bar baz=qux
0 = foo=bar
1 = baz=qux
var=val 参数是普通参数。
但与set -o keyword
$ set -k
$ bash -c '
env | grep -e foo -e baz
for ((i=0; i<=$#; i++)); do echo "$i = ${!i}"; done
' foo=bar baz=qux
foo=bar
baz=qux
0 = bash
检测到 var=val 参数,将其从参数中删除,然后放入环境中。
答案3
set -o keyword
允许设置由“keyword”定义的二进制 bash 选项之一,您需要将“keyword”替换为实际选项名称,例如可以将其替换为 xtrace,如下所示
这些选项采用 2 个值打开或关闭,例如set -o xtrace
将打开跟踪
要重置此选项,请使用set +o xtrace
可以通过省略关键字来获取所有选项设置的列表set -o
,而set +o
显示选项设置列表的替代视图,列出所有选项为您提供要使用的所有选项名称而不是“关键字”
set -k
本身是一个选项,用于更改环境分配语法,并在其他答案中进行了描述