shell - 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
。
正确的写法是什么?
解决方案
只需使用相同的代码:
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
推荐阅读
- jupyter-notebook - 无法连接到 jupyter lab 上正在运行的 jupyter notebook
- azure-devops - 在 Azure Pipelines 中手动更新内部版本号
- c# - 从我的数据库中检索一些空数据时遇到问题?
- php - 匹配没有主机的字符串
- python - 我应该使用哪种方法来计算光流地面实况?
- mysql - mysql 根据值显示列
- angular - 角度:想在组件中创建一个通用功能(不在服务中),以便不同组件可以共享该通用功能
- javascript - 如何直接连接到本地运行的 WS 服务器实例?
- android - 在本机反应中获取设备日期和时间。new Date() 不等于设备日期和时间
- javascript - 自动化工具提示功能 - 因此,可以使用 N 次