来自包装器的当前/工作目录问题

来自包装器的当前/工作目录问题

我遇到的一个常见打包问题是当工具在其根目录(安装目录)中查找相关资源时。

例如。 pkg-name ( /usr/share/pkg-name/pkg-name) 正在寻找resourceA ( ),因此除非您的 $PWD = ,否则/usr/share/pkg-name/resourceA您不能直接调用,因为如果您在其他地方(例如),该工具将查找并引发错误。因此,您被迫创建一个如下所示的包装器:/usr/share/pkg-name/pkg-name/usr/share/pkg-name//home/user/home/user/resourceA/usr/bin/pkg-wrapper

#!/bin/sh
cd /usr/share/pkg-name
exec pkg-name "\$@"

现在您可以/usr/bin/pkg-wrapper随心所欲地拨打电话,但您面临着一个新问题!通过cd /usr/share/pkg-name在包装器中添加 $PWD =/usr/share/pkg-name在脚本的上下文中。因此,想象一下pkg-wrapper -o file可以写入一个文件,现在pkg-wrapper -o file将尝试将文件保存file/usr/share/pkg-name/file(脚本上下文中的当前/工作目录)而不是/home/user/file(调用包装器的当前/工作目录)。因此,文件现在保存在您想要的文件夹中,如果/usr/share/pkg-name/受到写保护,您无论如何都会收到权限错误。因此,您不能再使用相对文件路径,并且被迫指定绝对路径,例如。或者像or 这样的pkg-wrapper -o /home/user/file小技巧。pkg-wrapper -o "$(pwd)/file"pkg-wrapper -o "$PWD/file"

有没有一种不可知的方法来解决这个常见问题?如果没有办法修补 ruby​​ 和 python 以使用“用户当前目录”而不是脚本/进程当前目录?我已经看过 bash set 选项、bundle exec 选项。

--magicoption例如,如果存在指定查看位置和来源的根目录的选项Gemfile,则vendor/ruby​​ 脚本的包装器可能如下所示。.bundle/

#!/bin/sh
exec bundle exec /usr/share/pkg-name/pkg-name.rb --magicoption /usr/share/pkg-name/ "\$@"

这只是 ruby​​ 包的一个示例,但对于任何语言的任何脚本/二进制文件来说都是同样的问题。

答案1

没有适用于任何类型脚本的解决方案,就像有两个工作目录一样。

你最好的选择是,在你的包装纸中

  • 解析引用具有真实路径的文件的参数,
  • 然后切换到脚本所在目录
  • 并使用参数的替换/完整路径运行程序

例如:

#!/bin/bash
# parse args that reference files
ARG=$(realpath $1)
cd /usr/share/pkg-name
exec bundle exec pkg-name.rb "$ARG"

相关内容