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