当鱼壳上的部分值为空时,无法设置壳环境

问题描述

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

  • $LIBRARY_PATH 被初始化为空值。
  • 然后将一些值附加到 $LIBRARY_PATH
  • $status 我看到命令已成功执行。
  • 但结果显示 $LIBRARY_PATH 仍然是空的。
⋊> /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
  • 然后我将 $LIBRARY_PATH 设置为某个值。
  • 再次附加新值。
  • 脚本执行成功。

反过来证明我的结论。

⋊> /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"