.desktop EXECコマンドから現在のパスを取得する

.desktop EXECコマンドから現在のパスを取得する

.desktopと同じディレクトリに保存されている.shを実行するために.desktopファイルをインポートしようとしています。ディレクトリ全体は、あるシステムから別のシステムに移動可能でなければなりません。

私の実行スクリプトはrun.sh

私は試した:

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
#Exec=sh -c "`dirname %k`/run.sh"
#Exec=bash -c "export PATH=$PATH:`dirname %k`; bash run.sh;"
#Exec=bash -c "export PATH=$PATH:`dirname %k`; sh run.sh;"
Exec=bash -c "export PATH=$PATH:`dirname %k`; run.sh;"

しかし、.desktopファイルをダブルクリックすると何も起こりません。 「run.sh」をダブルクリックして「実行」を選択すると、スクリプトが正しく実行されます。 ""を使用してコマンドラインからスクリプトを実行すると、sh run.sh正常に動作します。

どのアイデアや実際に実行したいパスをデバッグする方法はありますか?

答え1

~によるとデスクトップエントリの仕様:

フィールドコードは、引用されたパラメータ内で使用しないでください。

したがって、あなたのコマンドは%k文字通り提供されますbash。この行をExec次のように変更すると、これを防ぐことができます。

Exec=bash -c '"$(dirname "$1")"/run.sh' dummy %k

上記のコードはローカルで動作し、パスにスペースがある場合でも機能します。はスクリプト名として考えられるようにスクリプトdummyに提供され、拡張子はとして使用できます。ネストされた参照レイヤーは仕様に準拠し、スペースに安全でなければなりません。bash$0%k$1

必ずしもローカルファイルパスに拡張されるわけでは%kありません。 vfolder URI、空である可能性があり、真の移植性のあるスクリプトはこのような場合も考慮する必要があります。%kまた、それ自体は普遍的にサポートされていないため、使用するシステムにはいくつかの制限が必要です。


デバッグに関する限り、KDEで通常のシェルリダイレクトを使用できます。

Exec=bash -c ... > /tmp/desktop.log

これは標準化された動作ではなく、GNOMEや他の環境では機能しません。スクリプトに絶対パスを提供して、必要な方法で対応するパラメータと操作を記録することもできます。

答え2

スクリプトがファイルと同じディレクトリにある場合は、.desktop相対パスを使用します。あなたのものに触れたりbash -c修正したりする理由はありません。$PATHdirname

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
Exec=./run.sh

run.shファイルがファイルと同じディレクトリにあり、.desktop正しいshebang行がある限り:

#!/usr/bin/env bash

どこでも動作するはずです。#!/usr/bin/env bash代わりに、ユーザーの1人が#!/bin/bash使用できるようにし、スクリプトを完全に移植可能にします。bash$PATH


メモ:@マイケルホーマー指摘コメントでは、相対パスはすべてのデスクトップ環境では機能しません。 Cinnamonで試してみましたが、期待どおりに機能していたので、おそらく他のGnomeベースの環境でも動作します。 freedesktop.org仕様では、フルパスを使用する必要があることを示唆しているようです。

Execキーにはコマンドラインを含める必要があります。コマンドラインは実行可能プログラム(オプションで1つ以上の引数が続きます)で構成されています。実行プログラムは、フルパスまたは実行可能ファイル名のみを使用して指定できます。。フルパスが指定されていない場合は、デスクトップ環境で使用されている$ PATH環境変数で実行可能ファイルを見つけます。ランチャーの名前またはパスには等号( "=")を含めることはできません。パラメータはスペースで区切ります。

答え3

で述べたようにデスクトップエントリの仕様あるいは、%k他のフィールドコードは、引用されたパラメータ内では使用できません。ただし、引用符を使用せずにスペースを含む式を変数にコピーする方法があります。

Exec=k=$(echo %k) && "$(dirname "$k")"/run.sh

答え4

.desktopファイルの親ディレクトリへの相対パスを使用してプログラムを実行する方法(Gnome、、、、、、、、、、、、デスクトップ環境でテスト済み):KDEXfceLXDELXQtMATECinnamonBudgie

ドワーフ:

Exec=gnome-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

GNOME - 最新:

Exec=gnome-terminal -- bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'

キーDE:

Exec=konsole -e "bash -c 'cd $(printf '"%s"' "$(dirname "%k")"); bash "./relative_file_path.sh" parameter1 parameterN'"

Xfce:

Exec=xfce4-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

LXDE:

Exec=bash -c 'cd "%k"&&bash "./relative_file_path.sh" parameter1 parameterN'

LXQt:

Exec=bash -c 'cd "%k"&&bash "./relative_file_path.sh" parameter1 parameterN'

仲間:

Exec=mate-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

シナモン:

Exec=gnome-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

インコ:

Exec=tilix -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

上記のコードの.desktopファイルの例ExecLXDEおよびLXQt- を除くTerminal=falseTerminal=true

[Desktop Entry]
Version=1.0
Name=Name to display
Comment=A comment
Exec=...
Icon=utilities-terminal
Terminal=false //does not show the initial launcher app (terminal) window
Type=Application
Categories=Application;

python3の場合bash "./relative_file_path.sh" parameter1 parameterNに置き換えるpython3 "./file_content_search.py" parameter1 parameterNか、他のプログラムの場合は必要に応じて置き換えてください。

関連情報