`set -o keywords` 在 bash 上做什么?

`set -o keywords` 在 bash 上做什么?

到底是什么功能“关键词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 valuehello来自内联脚本的第一个命令行参数,并且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本身是一个选项,用于更改环境分配语法,并在其他答案中进行了描述

相关内容