我有以下情况:
我的所有软件都安装在该/home/daniel/*
路径上并在内部引用它。然而,当我使用网络驱动器时,引用会更改为/home/foo/daniel
,并且我无法再使用我的软件。
有没有办法改变 go 的路径,例如通过调用某些程序或更改某些环境变量?或者我必须有两套程序?
答案1
这取决于你的软件如何指的是到内部路径。
如果仅通过环境变量,您可以执行以下操作:
eval "$(export -p | sed 's|/home/daniel|/home/foo/daniel|g')"
将所有/home/daniel
s更改/home/foo/daniel
为其值。
添加/home/foo/daniel/lib
(或在安装了共享库的任何地方)$LD_LIBRARY_PATH
可以帮助您的程序找到它们。但是,如果您的某些软件被硬编码为在 中查找conf 文件/home/daniel/etc
或在 中查找某些数据文件/home/daniel/share
,则没有可以设置的等效标准环境变量来覆盖它。
如果您无法添加/home/daniel
->../foo/daniel
符号链接或无法创建 chroot 或用户安装命名空间来解决该问题,那么您最好使用例如重新编译您的软件--prefix=/var/tmp/daniel
,这样您就知道您始终可以将其符号链接到您想要的任何位置想。
答案2
我假设您正在谈论 shell 脚本。尝试使用脚本名称可用的事实 $0
。不幸的是,这可能类似于./myprog
,这没有帮助,因此使用realpath
(或等效项)来获取完整路径名。
据我从你的问题中可以看出,这应该总是有效。但是,如果它不够好,请尝试用作$PWD
后备。以下代码“应该”完成这项工作:
getdir()
{
case "$1" in
(*/daniel/*)
my_dir=$(printf '%s\n' "$1" | sed 's|/daniel/.*|/daniel|'
return 0
(*)
return 1
esac
}
getdir $(realpath "$0") || getdir "$PWD" || { echo "I dunno."; exit 1; }
所以,如果你的脚本目前说的是这样的
date >> /home/daniel/log
你会把它改成
date >> "$my_dir"/log
我只是偶然发现如何从脚本本身获取 Bash 脚本的源目录?,其中有 72 个答案,其中一些是上述答案的变体。