LD_LIBRARY_PATH在bash脚本中失败

时间:2014-06-28 21:04:05

标签: linux bash shell ld

我有一个运行这行代码的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会无法找到这些文件吗?

1 个答案:

答案 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"

如果您可以生成最小重现器,但这种情况不会发生,那将非常有用并且非常感激。