Jos*_*osh 5 alias environment-variables
如何创建作为特定命令结果的环境变量?具体来说,我想要一个环境变量 ($BWD),它是 $PWD 的基本名称
$ cd /home/devel/Autils/lib
$ echo $PWD
/home/devel/Autils/lib
$ # something here to assign BWD
$ echo $BWD
lib
Run Code Online (Sandbox Code Playgroud)
Ste*_*ris 12
通常,序列foo="$(bar)"将运行命令bar并将输出分配给变量。
例如
% echo $PWD
/home/sweh
% BWD="$(basename "$PWD")"
% echo $BWD
sweh
Run Code Online (Sandbox Code Playgroud)
这将创建一个 shell 变量。如果你想把它变成一个环境变量(可以被子shell看到)你可以export。
例如
export BWD="$(basename "$PWD")"
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下不需要运行命令,而是使用shell变量扩展
BWD=${PWD##*/}
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 11
在类似 Bourne 的 shell 中,您可以通过使用内置实用程序用属性标记一个shell变量来创建环境变量(因此它被导出到 shell 将执行的命令的环境中):exportexport
export BWD
Run Code Online (Sandbox Code Playgroud)
要为 shell 变量赋值,语法是:
BWD=value
Run Code Online (Sandbox Code Playgroud)
您可以使用命令替换使该值成为命令的输出。在 Bourne shell 中,这是使用`the-command`语法,但在现代类似 Bourne 的 shell 中,首选方法是使用$(the-command):
BWD=$(the-command)
Run Code Online (Sandbox Code Playgroud)
通常,您需要将命令替换用引号括起来以防止split+glob。但是, split+glob 不会出现在对标量变量的赋值中,因此这里不需要它们。
获取文件路径的基本名称的basename命令是命令。
basename "$PWD"
Run Code Online (Sandbox Code Playgroud)
(那里的引号是必要的,因为 split+glob 确实出现在命令的参数中)。
这将返回存储在 中的文件的基本名称$PWD,除非该值以 开头-,在这种情况下,YMMV 尽可能多的basename实现将其视为一个选项。所以一般来说,当向命令传递变量数据时,我们使用 a--来告诉命令,即使它以-(这里,$PWD应该总是以开头,/除非在非常病态的情况下,所以它不是严格的需要)。
BWD=$(basename -- "$PWD")
export BWD
Run Code Online (Sandbox Code Playgroud)
在现代 shell 中,您可以将两者结合使用:
export BWD="$(basename -- "$PWD")"
Run Code Online (Sandbox Code Playgroud)
(在某些实现中需要引号,因为我们回到命令的参数中,尽管其他一些实现确实export在某些条件下将类似赋值的参数解析为特殊情况)。
与该方法的一个问题是,如果的值$PWD作为新行字符端(不太可能在实践中)命令替换条所有尾随换行符。所以在:
mkdir $'foo\n\n'
cd $'foo\n\n'
export BWD="$(basename -- "$PWD")"
Run Code Online (Sandbox Code Playgroud)
$BWD将包含foo而不是$'foo\n\n'.
相反,您可能希望使用 shell 内置运算符来获取该基本名称。在 中zsh,这可以用$PWD:t( tfor tail)来完成;在所有类POSIX壳(包括zsh中),这是可以做到${PWD##*/}这消除了一切的最右边/,从内容$PWD。
但是如果$PWD是,它会给出不同的结果/。在这种情况下,basename返回/but${PWD##*/}或$PWD:t扩展为空字符串。对于像/foo/bar/($PWD通常/除了/它自己之外通常不会以结尾) 的目录,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
Run Code Online (Sandbox Code Playgroud)
上面,我们使用了特定于 ksh93 的命令替换形式:${ the-command; }它更有效,因为它不会创建子 shell 环境来运行命令。