/opt/...
フォルダーにある共有ライブラリを必要とする実行可能ファイルがあります。 LD_LIBRARY_PATH
の下の/etc/environment
にパスを含め、source /etc/environment
を使用して更新しました。ルート権限なしでこの実行可能ファイルを実行すると、libxxx.so: cannot open shared object file: No such file or directory
というエラーが表示されます。しかし、Sudo
で実行すると、実行されます。問題はありますが、ライセンスはrootユーザーではないため、ライセンスに関するエラーがスローされます。通常のユーザーがファイルを作成および削除できるように、/opt/...
の権限を変更しました。しかし、それは助けにはなりません。何が問題なのか、どうすれば修正できますか?
/etc/environment
はログイン時に解釈されます。したがって、/etc/environment
に加えた変更を確認する正しい方法は、ログアウトして再度ログインすることです。
Sudo
は、ログインをルートとして部分的にエミュレートするため機能します(Sudo -i
はさらに正確にログインをエミュレートします)。
source /etc/environment
は機能しません。source
は、指定されたファイルをシェルスクリプトとして解釈するようシェルに指示するシェルコマンドであるためです。問題は:/etc/environment
はシェルスクリプトではありません。次の形式の環境変数の名前と値のペアのリストです。
name="value"
その行は、シェルの場合、グローバル変数の定義であり、シェル自体のみが見ることができます。シェルから実行されたプログラムはそれを見ることができません。環境変数を定義する正しい方法は、export
Shellコマンドを使用することです。
export name="value"
したがって、ログアウトせずに真新しいLD_LIBRARY_PATH
を使用したい場合は、source /etc/environment
の代わりに次のコマンドを実行する必要があります。
export LD_LIBRARY_PATH="/opt/..."
UPDATE:LD_LIBRARY_PATH
は、/etc/environment
のため、ssh-agent
に設定できません。詳細については、 バグ#47958 および 環境変数 に関するUbuntu wikiページを参照してください。 Wikiページで指定されているように、回避策が存在し、/etc/ld.so.conf.d
を使用しています。
たとえば、次の内容の/etc/ld.so.conf.d/opt.conf
を作成できます。
# Paths for my cool libraries
/opt/...
これは回避策としてリストされていますが、ld.so.conf.d
は実際にそのような設定に最も適切な場所です。