首页 > 解决方案 > PRELOAD 在鱼壳上的等效写法是什么?

问题描述

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

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

我尝试用鱼壳做同样的事情。

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

但是,fish shell 无法识别 wordlibstdc++.so.6.0.26和 word之间的空格thirdparty
预期行为是脚本使用LD_PRELOAD库并执行命令protoc
正确的写法是什么?

标签: shellfishprotocld-preload

解决方案


只需使用相同的代码:

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

从fish 3.1开始,这将起作用。


设置 LD_PRELOAD /root/.conda/envs/myfish/lib/libstdc++.so.6.0.26 第三方/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

推荐阅读