当 fish shell 的部分值为空时无法设置 shell 环境
Fail to set shell enviroment when part of value is empty on fish shell
我无法在鱼 shell 上设置 shell 环境。这似乎是一个错误。
$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"
我无法在鱼 shell 上设置 shell 环境。这似乎是一个错误。
$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"