fish shell 上 PRELOAD 的等效写法是什么?

What's equivalent writing of PRELOAD on fish shell?

protoc 依赖于更高版本的 libstdc++。通常在 bash shell 我们写:

LD_PRELOAD=/root/.conda/envs/myfish/lib/libstdc++.so.6.0.26 thirdparty/protobuf/bin/protoc

我尝试用 fish shell 做同样的事情。

⋊> /h/m/rank4 on master ⨯ set LD_PRELOAD /root/.conda/envs/myfish/lib/libstdc++.so.6.0.26 thirdparty/protobuf/bin/protoc                                                                                                  (base) 15:02:02
⋊> /h/m/rank4 on master ⨯ echo $LD_PRELOAD                                                                                                                                                                                (base) 15:02:10
/root/.conda/envs/myfish/lib/libstdc++.so.6.0.26 thirdparty/protobuf/bin/protoc

但是,鱼 shell 不认识单词 libstdc++.so.6.0.26 和单词 thirdparty 之间的 space。
预期行为是脚本使用 LD_PRELOAD 库并执行命令 protoc.
正确的写法是什么?

只需使用相同的代码:

LD_PRELOAD=/root/.conda/envs/myfish/lib/libstdc++.so.6.0.26 thirdparty/protobuf/bin/protoc

从 fish 3.1 开始,这就可以了。


set LD_PRELOAD /root/.conda/envs/myfish/lib/libstdc++.so.6.0.26 thirdparty/protobuf/bin/protoc

将变量“LD_PRELOAD”设置为值“/root/.conda/envs/myfish/lib/libstdc++.so.6.0.26”和“thirdparty/protobuf/bin/protoc”

它不会将“thirdparty/protobuf/bin/protoc”识别为命令,就像 set 命令的另一个参数,因此是变量的另一个值。

如果您确实需要使用单独的 set(例如在 fish < 3.1 中),您需要 首先设置变量,然后 运行命令。此外,您需要“导出”变量,以便您 运行 的命令实际收到一个副本。所以代码是:

set -x LD_PRELOAD /root/.conda/envs/myfish/lib/libstdc++.so.6.0.26
thirdparty/protobuf/bin/protoc
# and now erase $LD_PRELOAD again:
set -e LD_PRELOAD

或者,或者,打开一个新块创建一个本地$LD_PRELOAD,这样它在最后会被自动擦除:

begin
    # the "-l" makes the variable local,
    # the "-x" passes it to external commands
    set -lx LD_PRELOAD /root/.conda/envs/myfish/lib/libstdc++.so.6.0.26
    thirdparty/protobuf/bin/protoc
end