【问题标题】:Fail to set shell enviroment when part of value is empty on fish shell鱼壳部分值为空时设置壳环境失败
【发布时间】:2021-04-21 08:30:32
【问题描述】:

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

  • $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

【问题讨论】:

  • Fish 2.3.1 是 2016 年的 - 那是 超级老。我建议升级。但其工作方式取决于您的操作系统 - 查看fishshell.com,它为许多人提供 PPA。

标签: shell environment-variables fish


【解决方案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 为空时,它什么都不做,而不是运行 for file in /* 的 bash 会做的事情,这是非常无用且可能有害的(想象一下 rm -rf $dirs/*)。

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

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

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多