如何解决在鱼壳上写 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 无法识别单词 libstdc++.so.6.0.26
和单词 thirdparty
之间的空格。
预期行为是脚本使用 LD_PRELOAD
库并执行命令 protoc
。
什么是正确的写作?
解决方法
只需使用相同的代码:
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.26thirdparty/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 首先设置变量,然后运行命令.此外,您需要“导出”变量,以便您运行的命令实际收到一个副本。所以代码是:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。