如何创建作为命令输出的环境变量

如何创建作为命令输出的环境变量

如何创建作为特定命令结果的环境变量?具体来说,我想要一个环境变量 ($BWD),它是 $PWD 的基本名称

$ cd /home/devel/Autils/lib
$ echo $PWD
/home/devel/Autils/lib
$ # something here to assign BWD
$ echo $BWD
lib

答案1

一般来说,序列foo="$(bar)"将运行命令bar并将输出分配给变量。

例如

% echo $PWD
/home/sweh
% BWD="$(basename "$PWD")"
% echo $BWD
sweh

这将创建一个 shell 变量。如果你想把它打造成环境变量(可以被子 shell 看到)你可以export

例如

export BWD="$(basename "$PWD")"

但是,在这种情况下不需要跑步一个命令,但使用 shell 变量扩展

BWD=${PWD##*/}

答案2

在类似 Bourne 的 shell 中,您可以创建环境变量通过标记export使用export内置实用程序将变量与属性一起导出(以便将其导出到 shell 将执行的命令的环境中):

export BWD

要将值赋给 shell 变量,语法为:

BWD=value

您可以使用该值作为命令的输出命令替换。在 Bourne shell 中,这是使用`the-command`语法,但在现代的类似 Bourne shell 中,首选方法是使用$(the-command)

BWD=$(the-command)

通常,您需要在命令替换周围加上引号以防止分割+全局。但是, split+glob 不会出现在标量变量的赋值中,因此这里不需要它们。

获取文件路径的基本名称的命令是命令basename

basename "$PWD"

(引号是必要的,因为 split+glob 确实出现在命令的参数中)。

这将返回存储在 中的文件的基本名称$PWD,除非该值以 开头-,在这种情况下,YMMV 因为许多basename实现都会将其视为一个选项。所以一般来说,当将变量数据传递给命令时,我们使用 a--告诉命令后面的内容不要被视为选项,即使它以-(这里,$PWD应该始终以 除了在非常病态的情况下开头/,所以它并不严格需要)。

BWD=$(basename -- "$PWD")
export BWD

在现代 shell 中,您可以将两者结合起来:

export BWD="$(basename -- "$PWD")"

(在某些实现中需要引号,因为我们回到了命令的参数中,尽管其他一些实现export在某些情况下确实将类似赋值的参数解析为特殊情况)。

该方法的一个问题是,如果 的值$PWD以换行符结尾(实际上不太可能),命令替换带子全部尾随换行符。所以在:

mkdir $'foo\n\n'
cd $'foo\n\n'
export BWD="$(basename -- "$PWD")"

$BWD将包含foo而不是$'foo\n\n'.

相反,您可能希望使用 shell 内置运算符来获取该基本名称。在 中zsh,可以使用$PWD:t( tfor tail);来完成在所有类似 POSIX 的 shell(包括zsh)中,可以通过${PWD##*/}删除/.$PWD

$PWD但如果是的话,它会给出不同的结果/。在这种情况下,basename返回/but${PWD##*/}$PWD:t扩展为空字符串。对于像这样的目录/foo/bar/(通常除了自身之外通常$PWD不会以 while 结尾),并给出, while再次给出空字符串。//basename$PWD:tbar${PWD##*/}

对于动态扩展为 的基本名称的变量$PWD,您可以使用ksh93和 它的纪律功能:

ksh93还有一个内置版本,basename只要您有/opt/ast/bin提前的$PATH.所以在 ksh93 中:

$ PATH=/opt/ast/bin:$PATH
$ type basename
basename is a shell builtin version of /opt/ast/bin/basename
$ BWD.get() { .sh.value=${ basename -- "$PWD"; }; }
$ cd /var/log
$ echo "$BWD"
log
$ cd /usr/local
$ echo "$BWD"
local
$ export BWD
$ printenv BWD
local

上面,我们使用了 ksh93 特定的形式命令替换${ the-command; }效率更高,因为它不会创建子 shell 环境来运行命令。

对于bash外壳,请参见声明变量时防止运行命令替换对于某些方法。

答案3

您可以使用该构造foo="$(command)"将 的输出返回command到变量 中foo。因此,对于您的用例:

$ BWD="$(basename "$PWD")"

相关内容