如何将envs中的所有路径替换为其他路径?

如何将envs中的所有路径替换为其他路径?

我有以下情况:

我的所有软件都安装在该/home/daniel/*路径上并在内部引用它。然而,当我使用网络驱动器时,引用会更改为/home/foo/daniel,并且我无法再使用我的软件。

有没有办法改变 go 的路径,例如通过调用某些程序或更改某些环境变量?或者我必须有两套程序?

答案1

这取决于你的软件如何指的是到内部路径。

如果仅通过环境变量,您可以执行以下操作:

eval "$(export -p | sed 's|/home/daniel|/home/foo/daniel|g')"

将所有/home/daniels更改/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 个答案,其中一些是上述答案的变体。

相关内容