当 fish shell 的部分值为空时无法设置 shell 环境

Fail to set shell enviroment when part of value is empty on fish shell

我无法在鱼 shell 上设置 shell 环境。这似乎是一个错误。

⋊> /h/m/g/gcc-releases-gcc-9.2.0 echo $LIBRARY_PATH                                                                                                                                                                       (base) 00:09:23

⋊> /h/m/g/gcc-releases-gcc-9.2.0 set LIBRARY_PATH /usr/lib/x86_64-linux-gnu:$LIBRARY_PATH                                                                                                                                 (base) 00:09:25
⋊> /h/m/g/gcc-releases-gcc-9.2.0 echo $status                                                                                                                                                                             (base) 00:09:39
0
⋊> /h/m/g/gcc-releases-gcc-9.2.0 echo $LIBRARY_PATH                                                                                                                                                                       (base) 00:09:45

⋊> /h/m/g/gcc-releases-gcc-9.2.0

反过来证明我的结论。

⋊> /h/m/g/gcc-releases-gcc-9.2.0 set LIBRARY_PATH /usr/lib/x86_64-linux-gnu                                                                                                                                               (base) 00:09:52
⋊> /h/m/g/gcc-releases-gcc-9.2.0 echo $LIBRARY_PATH                                                                                                                                                                       (base) 00:18:36
/usr/lib/x86_64-linux-gnu
⋊> /h/m/g/gcc-releases-gcc-9.2.0 set LIBRARY_PATH /usr/lib/x86_64-linux-gnu:$LIBRARY_PATH                                                                                                                                 (base) 00:18:53
⋊> /h/m/g/gcc-releases-gcc-9.2.0 echo $LIBRARY_PATH                                                                                                                                                                       (base) 00:18:57
/usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu

顺便说一句,我的鱼版本是 2.3.1。有人能告诉我为什么吗?

⋊> /h/m/g/gcc-releases-gcc-9.2.0 fish --version                                                                                                                                                                           (base) 00:21:46
fish, version 2.3.1

引用它:

set LIBRARY_PATH /usr/lib/x86_64-linux-gnu:"$LIBRARY_PATH"
# or
set LIBRARY_PATH "/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH"

所有 fish 变量都是列表,当它连接一个列表和一些字符串时,它通过将所有列表元素与字符串组合来实现:

set list 1 2 3
echo foo$list
# prints 'foo1 foo2 foo3'

未定义变量是空列表,所以它把字符串和全零元素组合在一起,所以逻辑结论是什么都没有:

set list
echo foo$list
# prints nothing

当你做类似

的事情时,这非常有用
set dirs /home /bin /etc
for file in $dirs/*
    echo $file
end

set dirs # $dirs is now empty
for file in $dirs/*
    echo $file # does not run
end

因为,当 $dirs 为空时,它什么都不做,而不是 bash 会做的 运行 for file in /*,这是非常无用且可能有害的(想象一下 rm -rf $dirs/*).

为避免这种情况,您可以双引号变量,在这种情况下它会扩展为一个字符串:

set empty
echo foo"$empty"
# prints "foo"