我有一个运行这行代码的bash脚本:
LD_LIBRARY_PATH=/tools/cluster/6.2/openbabel/2.3.2/lib ./xattr infile.txt outfile.txt
如果我直接从shell调用此行,它可以正常工作。但是,如果我在bash脚本中运行它,我会收到此错误:
update.sh: line 45: LD_LIBRARY_PATH=/tools/cluster/6.2/openbabel/2.3.2/lib: No such file or directory
为什么LD_LIBRARY_PATH在bash脚本中设置时不起作用?
以下是第45行的更多代码:
BASE_DIR="/volatile/huanlab/bold/kendal/bioinformatics_database/tmp"
COMP_DIR="$BASE_DIR/compound"
# move to the current directory where xattr.cpp and other files are
cd /users/kharland/software/programs/BioDB-update/dev
# Compile xattr ('make xattr' is the same command I call from the shell
# to compile this program when this program actually works).
make xattr
# loop over each .sdf file in COMP_DIR
for INF in $(ls $COMP_DIR | grep sdf)
do
babel -isdf $COMP_DIR/$INF -ocan $SMILES_DIR/$INF.csv
LD_LIBRARY_PATH=/tools/cluster/6.2/openbabel/2.3.2/lib ./xattr $COMP_DIR/$INF $COMP_DIR/$COMP_FILE
done
这些行之前的内容只是评论
修改
在我的makefile中,我正在使用这些选项进行编译
LDLIBS=-lm -ldl -lz -lopenbabel
LDFLAGS=-Wl,-rpath,/tools/cluster/6.2/openbabel/2.3.2/lib:/tools/cluster/system/pkg/openbabel/openbabel-2.3.2/build/lib,-L/tools/cluster/6.2/openbabel/2.3.2/lib
并且运行ldd xattr
表明这些库确实已链接,因此程序在从shell调用时按预期执行。唯一的问题是使用bash脚本。如果我从bash脚本中删除LD_LIBRARY_PATH选项,我会遇到一个问题,即使ldd显示xattr知道lib的位置,找不到openbabel的共享库。这就是为什么我在bash脚本中添加了LD_LIBRARY_PATH,我试图将其用作解决方法
修改
(纠正错误:将'库'换成'我的代码'在下面)
(下面的文件系统名称错误)
刚刚发生了一件事。我的源代码在/users
文件系统中。如果我的库位于不同的已安装文件系统上,bash会无法找到这些文件吗?
答案 0 :(得分:2)
设置环境变量 在bash脚本中工作。
试试这个:
#!/bin/bash
VAR1=VALUE1 env
...运行该脚本,您将看到包含VAR1
及其值的输出。
一般来说,这也适用于LD_LIBRARY_PATH
:
#!/bin/bash
tempdir=$(mktemp -t -d testdir.XXXXXX)
LD_LIBRARY_PATH=$tempdir env
rm -rf "$tempdir"
如果您可以生成最小重现器,但这种情况不会发生,那将非常有用并且非常感激。