我遇到的一个常见打包问题是当工具在其根目录(安装目录)中查找相关资源时。
例如。 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"