问题描述
-
$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"