次のデスクトップ項目があります。
[Desktop Entry]
Name=dummy
Type=Application
Terminal=false
Icon=/home/xyz/Software/Test/ico.png
Exec= /home/xyz/Software/Test/start
以下を含むファイルを実行する必要があります。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./Linux/lib
exec ./foo --gc=sgen
シンボリックリンクを作成しましたが、結果は同じです。何もしません。フォルダ内のファイルをダブルクリックすると、次のメッセージが表示されます。
クリックするとうまく動作しますが、Run
デスクトップで実行すると..
このパスをPATHにエクスポートしようとしましたが、実行時にライブラリが見つかりませんでしたがfoo
...アイコンが正常に表示されるため、パスは100%正確です。
私がやりたいことは、start
ファイルやファイルfoo
に対して機能するデスクトップショートカットを作成することです。(何らかの理由でエラーなしで実行されません。パスをPATHに追加しました。実行時に「--gc = sgen」引数が欠落している可能性があります。)
どんな助けでも大変感謝します!
ベストアンサー1
問題は、スクリプトが相対パス(、)を使用していること./Linux/lib
です./foo
。これらのパスは現在のディレクトリに基づいています。スクリプトを実行するプロセスの現在のディレクトリは、スクリプトを起動したすべてのプロセスの現在のディレクトリです。デスクトップアイコンをクリックしてスクリプトを実行すると、現在のディレクトリがホームディレクトリになります。
cd
1つの回避策は、スクリプトにコマンドを追加して、アプリケーションがインストールされているディレクトリに変更することです。
#!/bin/sh
cd /home/xyz/Software/Test/
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:./Linux/lib"
exec ./foo --gc=sgen
ただし、現在のディレクトリを変更せずに絶対パスを使用する方が便利です。たとえば、スクリプトを使用して現在のディレクトリからファイルを開くことができます。これを実行しながら、スクリプトコマンドラインの引数をアプリケーションに渡す"$@"
呼び出しを追加しました。foo
#!/bin/sh
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/xyz/Software/Test/Linux/lib"
exec /home/xyz/Software/Test/foo --gc=sgen "$@"
スクリプトがアプリケーションディレクトリにある場合は、その場所を検出することができます。$0
スクリプトへのパスです。${0%/*}
最後のスラッシュの後のすべての内容が削除されたスクリプトへのパス。つまり、スクリプトを含むディレクトリへのパスです。
#!/bin/sh
foo_directory="${0%/*}"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
exec "$foo_directory/foo" --gc=sgen "$@"
最初に空の場合は、LD_LIBRARY_PATH
現在のディレクトリを追加しますが、これはおそらく良い考えではありません。あなたはそれをテストする必要があります。
#!/bin/sh
foo_directory="${0%/*}"
if [ -n "$LD_LIBRARY_PATH" ]; then
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
else
export LD_LIBRARY_PATH="$foo_directory/lib"
fi
exec "$foo_directory/foo" --gc=sgen "$@"
または(で空の項目を使用しないと仮定すると、LD_LIBRARY_PATH
これは合理的な選択です)
#!/bin/sh
foo_directory="${0%/*}"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
LD_LIBRARY_PATH="${LD_LIBRARY_PATH#:}"
exec "$foo_directory/foo" --gc=sgen "$@"