我有一个Bash脚本需要知道它的完整路径.我试图找到一种广泛兼容的方式来做到这一点,而不会结束相对或时髦的路径.我只需要支持Bash,而不是sh,csh等.
到目前为止我发现了什么:
从地址中获取Bash脚本的源目录的接受答案是获取脚本的路径dirname $0
,这很好,但可能会返回相对路径(如.
),如果要更改目录中的目录,这是一个问题脚本并使路径仍指向脚本的目录.不过,dirname
将成为这个难题的一部分.
对OS X的Bash脚本绝对路径 的接受答案(特定于OS X,但答案无论如何)都会给出一个函数,该函数将测试是否$0
看起来相对,如果是,则会预先挂起$PWD
.但是结果仍然可以包含相对位(虽然总体来说它是绝对的) - 例如,如果脚本t
在目录中/usr/bin
并且你进入/usr
并且你输入bin/../bin/t
它来运行它(是的,那是复杂的),你最终会得到/usr/bin/../bin
as脚本的目录路径.哪个有效,但......
此页面上的readlink
解决方案如下所示:
# Absolute path to this script. /home/user/bin/foo.sh
SCRIPT=$(readlink -f $0)
# Absolute path this script is in. /home/user/bin
SCRIPTPATH=`dirname $SCRIPT`
Run Code Online (Sandbox Code Playgroud)
但是readlink
不是POSIX,显然解决方案依赖于GNU readlink
,其中BSD由于某种原因无法工作(我无法访问类似BSD的系统进行检查).
所以,各种方式,但他们都有他们的警告.
什么是更好的方式?"更好"的意思是:
我先执行了命令: export LD_LIBRARY_PATH=/usr/local/lib
然后我打开了.bash_profile
文件:vi ~/.bash_profile
.在这个文件中,我把:
LD_LIBRARY_PATH=/usr/local/lib
export LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
然后,如果终端关闭并重新启动,则键入不echo $LD_LIBRARY_PATH
显示结果.
如何永久设置路径?
我是使用 linux 的新手。根据有关我的项目的指南,我必须多次导出 LD_LIBRARY_PATH,我不确定是否没有覆盖它们。
#Cupti + Tensorflow_CUDAit
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/extras/CUPTI/lib64
#Mujoco
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/robolab/.mujoco/mujoco200/bin
export MUJOCO_PY_MJPRO_PATH=$HOME/.mujoco/mujoco200/
export MUJOCO_PY_MJKEY_PATH=$HOME/.mujoco/mjkey.txt
#Mujoco_py
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libGLEW.so
Run Code Online (Sandbox Code Playgroud)
这是正确的方法还是我覆盖它们?如果是这样,正确的方法是什么?
先感谢您。
我已经看到了许多 LD_LIBRARY_PATH 的链接,但无法获得 LD_LIBRARY_PATH 的确切方法。我在那里使用了 ldd (用于动态库)
linux-gate.so.1 => (0x00f84000)
libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x0018c000)
libxml2.so.2 => /usr/local/lib/libxml2.so.2 (0x00318000)
libxmlsec1.so.1 => /usr/local/lib/libxmlsec1.so.1 (0x00caa000)
libprotobuf-c.so.0 => /usr/local/lib/libprotobuf-c.so.0 (0x00957000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00110000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x009cc000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00136000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x00b89000)
libxslt.so.1 => /usr/local/lib/libxslt.so.1 (0x0013a000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00172000)
libltdl.so.7 => /usr/lib/libltdl.so.7 (0x0017b000)
/lib/ld-linux.so.2 (0x007d1000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00d6a000)
Run Code Online (Sandbox Code Playgroud)
请告诉我必须用路径定义的确切方式和位置。