如何创建作为特定命令结果的环境变量?具体来说,我想要一个环境变量 ($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
( t
for tail);来完成在所有类似 POSIX 的 shell(包括zsh)中,可以通过${PWD##*/}
删除/
.$PWD
$PWD
但如果是的话,它会给出不同的结果/
。在这种情况下,basename
返回/
but${PWD##*/}
或$PWD:t
扩展为空字符串。对于像这样的目录/foo/bar/
(通常除了自身之外通常$PWD
不会以 while 结尾),并给出, while再次给出空字符串。/
/
basename
$PWD:t
bar
${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")"