私が直面している一般的なパッケージングの問題は、ツールがルートディレクトリ(インストールディレクトリ)から関連リソースを見つけるときです。
例えば。 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/
pkg-wrapper -o /home/user/file
pkg-wrapper -o "$(pwd)/file"
pkg-wrapper -o "$PWD/file"
この一般的な問題を解決するための不可知論的な方法はありますか?スクリプト/プロセス現在のディレクトリの代わりに「ユーザー現在のディレクトリ」を使用するようにRubyとPythonにパッチを適用する方法がない場合はどうなりますか? bashセットオプション、バンドルexecオプションを見ました。
--magicoption
たとえば、表示位置とソースのルートディレクトリを指定するオプションがある場合、Rubyスクリプトのラッパーは次のようになりますGemfile
。vendor/
.bundle/
#!/bin/sh
exec bundle exec /usr/share/pkg-name/pkg-name.rb --magicoption /usr/share/pkg-name/ "\$@"
これはRubyパッケージの例にすぎませんが、すべての言語のすべてのスクリプト/バイナリでも同じ問題が発生します。
答え1
2つの作業ディレクトリを持つようなあらゆる種類のスクリプトに対する解決策はありません。
最良の方法は包装紙に
- 実際のパスを持つファイルを参照する引数を解析します。
- 次に、スクリプトがあるディレクトリに切り替えます。
- パラメータの代替/フルパスを使用してプログラムを実行します。
たとえば、
#!/bin/bash
# parse args that reference files
ARG=$(realpath $1)
cd /usr/share/pkg-name
exec bundle exec pkg-name.rb "$ARG"