testter Asked: 2020-01-28 05:14:04 +0800 CST2020-01-28 05:14:04 +0800 CST 2020-01-28 05:14:04 +0800 CST bash 上的“set -o 关键字”在做什么? 772 bash shell 上的命令分配的“关键字”选项究竟是什么功能?set 选项: set -o keyword 或者 set -k 一个简单的例子就足以让我理解。 bash set 2 个回答 Voted Best Answer Kusalananda 2020-01-28T05:33:24+08:002020-01-28T05:33:24+08:00 通常,要为命令注入环境变量,您可以在命令之前对名称进行赋值,如下所示: VARIABLE=value bash -c 'echo "$1 $VARIABLE"' bash hello 这将运行bash -c 'echo "$VARIABLE"' bash hello并设置为该命令环境中VARIABLE的字符串value。在这种情况下,该命令将打印hello value(hello来自内联脚本的第一个命令行参数,并value来自环境变量)。 使用set -o keyword(or 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 我从未见过“在野外”使用此选项,并且我假设它仅在非常特定的情况下很少使用,因为它从根本上改变了命令的解析方式。 glenn jackman 2020-01-28T05:29:56+08:002020-01-28T05:29:56+08:00 从手册: -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 参数,将其从参数中删除,然后放入环境中。
通常,要为命令注入环境变量,您可以在命令之前对名称进行赋值,如下所示:
这将运行
bash -c 'echo "$VARIABLE"' bash hello
并设置为该命令环境中VARIABLE
的字符串value
。在这种情况下,该命令将打印hello value
(hello
来自内联脚本的第一个命令行参数,并value
来自环境变量)。使用
set -o keyword
(orset -k
) inbash
(这是一个非标准的 shell 选项),允许在命令行的任何地方进行赋值:我从未见过“在野外”使用此选项,并且我假设它仅在非常特定的情况下很少使用,因为它从根本上改变了命令的解析方式。
从手册:
通过一些实验:
var=val 参数是普通参数。
但随着
set -o keyword
检测到 var=val 参数,将其从参数中删除,然后放入环境中。