*.desktopまたはシンボリックリンクが機能しない(このファイルのみ) - Linux Mint 17.2 Cinnamon

*.desktopまたはシンボリックリンクが機能しない(このファイルのみ) - Linux Mint 17.2 Cinnamon

次のデスクトップ項目があります。

[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

シンボリックリンクを作成しましたが、結果は同じです。何もしません。フォルダ内のファイルをダブルクリックすると、次のメッセージが表示されます。

http://1.bp.blogspot.com/-hfJadnx7lM8/T_qkxu6wanI/AAAAAAABtM/TBiFSfVzJeg/s1600/2012-07-09-162344_514x187_scrot.png

クリックするとうまく動作しますが、Runデスクトップで実行すると..

このパスをPATHにエクスポートしようとしましたが、実行時にライブラリが見つかりませんでしたがfoo...アイコンが正常に表示されるため、パスは100%正確です。

私がやりたいことは、startファイルやファイルfooに対して機能するデスクトップショートカットを作成することです。(何らかの理由でエラーなしで実行されません。パスをPATHに追加しました。実行時に「--gc = sgen」引数が欠落している可能性があります。)

どんな助けでも大変感謝します!

ベストアンサー1

問題は、スクリプトが相対パス(、)を使用していること./Linux/libです./foo。これらのパスは現在のディレクトリに基づいています。スクリプトを実行するプロセスの現在のディレクトリは、スクリプトを起動したすべてのプロセスの現在のディレクトリです。デスクトップアイコンをクリックしてスクリプトを実行すると、現在のディレクトリがホームディレクトリになります。

cd1つの回避策は、スクリプトにコマンドを追加して、アプリケーションがインストールされているディレクトリに変更することです。

#!/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 "$@"

おすすめ記事