ターミナルで.desktopファイルを実行する


141

私が収集できるものから、.desktopファイルはアプリケーションの設定をカスタマイズできるショートカットです。たとえば、私は自分の/usr/share/applications/フォルダにそれらの多くを持っています。

そのフォルダをで開くとnautilus、関連するファイルをダブルクリックするだけでこれらのアプリケーションを実行できます。たとえば、ダブルクリックfirefox.desktopするとFirefoxが実行されます。ただし、ターミナルを介して同じことを行う方法が見つかりません。

私がやるgnome-open foo.desktopと、単にfoo.desktopテキストファイルとして開きます。実行可能にしてからbashで実行すると、失敗するだけです(予想どおり、明らかにbashスクリプトではありません)。
編集:所有権を自分自身に変更してもexec /fullpath/foo.desktop、実行するとPermission deniedメッセージが表示されます。実行可能ファイルを作成して同じコマンドを実行すると、使用しているターミナルタブが単純に閉じます(クラッシュすると推測します)。最後に、もしそうならsudo exec /fullpath/foo.desktop、エラー報告を受け取りますsudo: exec: command not found

それが私の質問です、どのようfoo.desktopにターミナルからファイルを実行できますか?


5
注:exec失敗した理由は、execが現在実行中のプロセスを指定したプロセスに置き換えるためです。そのため、デスクトップをコンパイル済みバイナリとして実行するようにシェルを置き換えようとしました。できなかった理由sudo execは、シェル組み込みコマンドであり、バイナリコマンドではないためです。
デニーズ

興味深いことに、なぜタブが閉じてしまうのだろうと思いました。
マラバルバ


なるほど、彼らは.desktopファイルを解析することになります。とにかくリンクをありがとう。
エンゾチブ

モデレーター:おっと、これに誤ってフラグを立てた可能性があると思います。その場合は申し訳ありません
クロードランシャン

回答:


54

実行されるコマンドはデスクトップファイル内に含まれており、先頭に次のExec=ように抽出して実行できます。

`grep '^Exec' filename.desktop | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g'` &

それを壊すために

grep  '^Exec' filename.desktop    - finds the line which starts with Exec
| tail -1                         - only use the last line, in case there are multiple
| sed 's/^Exec=//'                - removes the Exec from the start of the line
| sed 's/%.//'                    - removes any arguments - %u, %f etc
| sed 's/^"//g' | sed 's/" *$//g' - removes " around command (if present)
`...`                             - means run the result of the command run here
&                                 - at the end means run it in the background

あなたはファイルでこれを置くことができる、と言う~/bin/deskopen内容で

#!/bin/sh
`grep '^Exec' $1 | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g'` &

次に、実行可能にします

chmod +x ~/bin/deskopen

そして、あなたができる、例えば

deskopen /usr/share/applications/ubuntu-about.desktop

引数(%u%Fなど)がで詳述されてhttp://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variablesそれらのどれも、コマンドラインで起動するための関連していません- 。


これにより、これまでのところ最高の結果が得られますが、望ましくない動作が発生することがあります。「Exec =」行に%uや%iなどの引数がある場合は常に発生します。Bashはその文字列を通常の引数として渡そうとします。たとえば、実行grep '^Exec' firefox.desktop | sed 's/^Exec=//'すると、www。%u.comをロードするタブでFirefoxが開きます。
マラバルバ

今のところsed、引数を削除するために1秒追加しました。しかし、私はそれを実行するより「自然な」方法があるかもしれないと思います。
マラバルバ

追加のsedで回答を更新しました-デスクトップファイルに引数がある可能性があることを忘れていました。
ハミッシュダウナー

「Execは=」複数回出現することができ、その後、唯一の最後の外観は実行されなければならないので、..あなたは、「グレップ」の後にパイプに「テール-1」を追加しなければならない
デイジー

13
-1:これは単純なために働くかもしれ.desktopファイルが、それは次のようにエントリを無視Path=し、TryExec=実行に影響を与える可能性があります。またExec=、ファイルにデスクトップアクション(「クイックリスト」)が含まれている場合も間違って実行されます
-MestreLion

85

答えは

xdg-open program_name.desktop

しかし、バグが原因でこれは機能しなくなりました。


7
うわー、これはまだバグであり、xdgで多くの進歩があります。 exo-open回避策としてリストされており、geditも開きます。:(
ドリュー

1
@RichardHolloway:を呼び出しgnome-openませxdg-open、それは逆です!そのため、問題はgvfs-open(後継者またはgnome-open
メストレリオン

13
「機能しなくなった」?しなかった!xdg-openmimetypeアソシエーションによって機能し、.desktopファイルはテキストのサブクラスであるため、ファイルはテキストエディターに関連付けられています
-MestreLion

13
これは非常に愚かです(ターミナルからデスクトップファイルを実行する賢明な方法はありません)
サムワトキンス14年

2
Arch Linuxでも動作しますが、Ubuntu固有のバグかもしれません。
ビクター

75

gtk-launchただ行くだけをサポートする最近のubuntuで

gtk-launch <file>.desktopファイルの名前がどこであるの有無にかかわらず.desktop一部

だからgtk-launch foo開くfoo.desktop

gtk-launchドキュメント

.desktopは/ usr / share / applications、/ usr / local / share / applicationsまたは〜/ .local / share / applicationsにある必要があります

端末またはalt + F2から使用可能(alt + F2はコマンドを履歴に保存するので、簡単にアクセスできます)


これが方法であり、debianでも動作します。

gtk-launch firefox.desktop〜/ .local / share / applications /は、私のためにディレクトリ〜/ .local / share / applications /表示して firefoxを起動します。あなたが正しかったようであれば、firefoxは.desktopファイルのディレクトリを引数として渡すべきではありませんでした。実際には、打ち上げをGTKに渡されたディレクトリが(実際に、ではない)の.desktopファイルを含むディレクトリを見つけるために使用することが想定されていない
Croad Langshan

わーい!うまくいく答え!
アリシア

これはArch Linuxでも機能します。他の答えはどれも満足のいくものではありませんでしたが、これは良いことです。:-) KDEを実行していても動作します。
MountainX

2
Ubuntu 18.10では、このバージョンは機能しません。デスクトップファイルがあるフォルダーにいるかどうか、.desktop拡張子を含めるかどうか、およびディレクトリに個別に名前を付けるかどうかに関係なく、アプリケーションが存在しないことを訴えるたびに。
ジョセフガービン

38

今日(12.10)現在、バグはまだ存在しています。それは実際にはgvfs-open(によって呼ばれるxdg-open)動作に依存します。

それでも、私は簡単な回避策を管理しました(nautilusのソースコードからインスピレーションを盗みます)。少し複雑ですが、Ubuntu 12.10では問題なく機能?し、Unityランチャーに意味のあるアイコン(これ以上)は追加されません。

最初に、Gioを使用してPythonスクリプトを作成し、次の名前で保存しました~/bin/run-desktop

#!/usr/bin/python

from gi.repository import Gio
import sys 

def main(myname, desktop, *uris):
    launcher = Gio.DesktopAppInfo.new_from_filename(desktop)
    launcher.launch_uris(uris, None)

if __name__ == "__main__":
    main(*sys.argv)

スクリプトには実行許可が必要なので、これをターミナルで実行しました。

chmod +x ~/bin/run-desktop

次に、相対.desktopエントリを作成しました~/.local/share/applications/run-desktop.desktop

[Desktop Entry]
Version=1.0
Name=run-desktop
Exec=run-desktop %U
MimeType=application/x-desktop
Terminal=false
Type=Application

最後に~/.local/share/applications/mimeapps.list[Default Applications]セクションの下のエントリをデフォルトハンドラとして関連付けました。

[Default Applications]
....
application/x-desktop=run-desktop.desktop

今:

  • xdg-open something.desktopは期待どおりに動作します
  • #!/usr/bin/xdg-open 実行可能なデスクトップエントリの上にあるhashbangも機能します

いつgvfs-openバグを解決するかは役に立たないが、それまでは...


1
これは、コマンド内の複数の行とパラメーターを正しく処理するため、Hamish Downerの答えよりもうまく機能Exec=%ます。
フリム

4
コードをありがとう-私はLucidを使用しています。これをとして保存/usr/bin/xdg-openpyし、chmod +x-のlauncher.launch([],context)代わりに使用します...None,context)(「TypeError:引数1:NoneTypeではなくシーケンスでなければならないため」)。今xdg-openpy app.desktop(ときダブルクリック通常通り、すべてのコマンドラインから動作しますapp.desktop)、そして私は、端末に呼び出そうと、それは私を思い出させることができますxdg-openし、Tabキーを押します。乾杯!
sdaau

3
+1。これは、.desktopファイルを手動で解析する必要のない唯一の答えであるため、最も健全な(かつ安全な)アプローチです。またgi.repository、廃止予定の代わりにモダンを使用しているpygtkので、素晴らしいです!:)
メストレリオン

2
実際、これはCarlo Pellegriniの答えに関する質問です。私は初心者です。もっと良い方法があれば修正してください。スクリプトは非常にうまく機能しますが、Unityランチャーに表示されるアイコンは、.desktopファイルで定義されたアイコンではなく、「Exec」コマンドのデフォルトアイコンです。それについてのアイデアはありますか?
インゴレオンハルト

1
@Noitidartが最後の答えを書いてmoがグーグルをするようになり、私はそれを見つけまし。それをチェックアウトし、多分それは助けていない
インゴ・レオンハルトを

31

正しい方法

使用gtk-launch可能であれば、実際に使用する必要があります。通常、パッケージlibgtk-3-binの一部です(これはディストリビューションによって異なる場合があります)。

gtk-launch 次のように使用されます。

gtk-launch APPLICATION [URI...]
gtk-launch app-name.desktop
gtk-launch app-name

.desktopファイルをインストールgtk-launchする必要があることに注意してください(つまり、またはにあります)。/usr/share/applications~/.local/share/applications

そのため、これを回避するために、目的の.desktopファイルを起動する前に一時的にインストールするハックのような小さなBash関数を使用できます。.desktopファイルをインストールする「正しい」方法は経由ですdesktop-file-installが、それは無視します。

launch(){

    # Usage: launch PATH [URI...]

    # NOTE: The bulk of this function is executed in a subshell, i.e. `(..)`
    #       This isn't strictly necessary, but it keeps everything
    #       out of the global namespace and lessens the likelihood
    #       of side effects.

    (

    # where you want to install the launcher to
    appdir=$HOME/.local/share/applications

    # the template used to install the launcher
    template=launcher-XXXXXX.desktop

    # ensure $1 has a .desktop extension, exists, is a normal file, is readable, has nonzero size
    # optionally use desktop-file-validate for stricter checking
    # desktop-file-validate "$1" 2>/dev/null || {
    [[ $1 = *.desktop && -f $1 && -r $1 && -s $1 ]] || {
        echo "ERROR: you have not supplied valid .desktop file" >&2
        return 1
    }

    # ensure the temporary launcher is deleted upon exit
    trap 'rm "$launcherfile" &>/dev/null' EXIT

    # create a temp file to overwrite later
    launcherfile=$(mktemp -p "$appdir" "$template")

    launchername=${launcherfile##*/}

    # overwrite temp file with the launcher file
    if cp "$1" "$launcherfile" &>/dev/null; then
        gtk-launch "$launchername" "${@:2}"
    else
        echo "ERROR: failed to copy launcher to applications directory" >&2
        return 1
    fi

    )

}

次のように使用できます(必要に応じて追加の引数またはURIも渡します)。

launch PATH [URI...]
launch ./path/to/shortcut.desktop

手動の代替

.desktopファイルを手動で解析して実行する場合は、次のawkコマンドで実行できます。

awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system($0)}' app-name.desktop

awkコマンドをオールインワンスクリプトのように扱いたい場合。エラーメッセージを表示して、Execコマンドが見つからない場合に戻りコード1で終了することもできます。

awk 'BEGIN {command=""} /^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); command=$0; exit} END {if (command!="") {exit system(command)} else {if (FILENAME == "-") {printf "ERROR: Failed to identify Exec line\n" > "/dev/stderr"} else {printf "ERROR: Failed to identify Exec line in \047%s\047\n", FILENAME > "/dev/stderr"} close("/dev/stderr"); exit 1}}'

前述のコマンドは:

  1. Exec =で始まる行を見つけます
  2. Exec =を削除
  3. Exec変数(%f%uなど%U)を削除します。仕様が意図するようにこれらを位置引数に置き換えることは可能ですが、そうすることは問題をかなり複雑にします。最新のデスクトップエントリ仕様を参照してください。
  4. コマンドを実行する
  5. 適切な終了コードですぐに終了します(複数のExec行を実行しないように)

このAWKスクリプトは、他の回答のいくつかによって適切に対処される場合とされない場合があるいくつかのエッジケースに対処していることに注意してください。具体的には、このコマンドは複数のExec変数を削除し(%記号を削除しないように注意)、単一のExec行コマンドのみを実行し、Exec行コマンドに1つ以上の等号(例:)が含まれていても期待どおりに動作しscript.py --profile=nameます。

いくつかの他の警告...仕様によると、TryExecは次のとおりです。

プログラムが実際にインストールされているかどうかを判断するために使用されるディスク上の実行可能ファイルへのパス。パスが絶対パスでない場合、ファイルは$ PATH環境変数で検索されます。ファイルが存在しない場合、または実行可能でない場合、エントリは無視される場合があります(たとえば、メニューでは使用されません)。

それを念頭に置いて、その価値を実行することは意味がありません。

その他の懸念事項はPathTerminalです。パスは、プログラムを実行する作業ディレクトリで構成されます。ターミナルは、プログラムがターミナルウィンドウで実行されるかどうかを示すブール値です。これらはすべて対処できますが、仕様の実装がすでにあるため、車輪を再発明する意味はありません。Pathを実装したい場合system()、サブプロセスが生成されることに注意してください。そのため、などの操作を行って作業ディレクトリを変更することはできませんsystem("cd \047" working_directory "\047"); system(command)。ただし、おそらく次のようなことができますsystem("cd \047" working_directory "\047 && " command)。注\ 047は一重引用符です(したがって、コマンドはスペースを含むパスで中断しません)。

Pythonの代替

ここでCarloからページを盗んでいます。彼はgiモジュールを利用するPythonスクリプトを作成することを提案しました。ファイルを作成してI / Oを心配することなく、シェルから同じコードを実行する最小限の方法を次に示します。

launch(){

# Usage: launch PATH [URI...]

python - "$@" <<EOF
import sys
from gi.repository import Gio
Gio.DesktopAppInfo.new_from_filename(sys.argv[1]).launch_uris(sys.argv[2:])
EOF

}

次に、次のようにランチャー関数を実行します。

launch ./path/to/shortcut.desktop

URIの使用はオプションです。また、エラーチェックは実行されないため、スクリプトを永続的にする場合は、ランチャーが存在し、(使用する前に)読み取り可能であることを確認する必要があります。


しかし、awkコマンドは素晴らしいです。したがって、+ 1
AB

このコンテキストのURIとは何ですか?任意のフォルダーにデスクトップファイルがあります。他のスクリプトでラップせずにgtk-launchを実行するにはどうすればよいですか?これは腹立たしいです。
ジョセフガービン

このawk解決策は、コマンドに二重エスケープされた空白またはバックスラッシュが含まれる場合、適切に機能しません。これは破られます:Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnkそしてdex解決策はうまく働きます。
MarSoft

27

OPはKDEについて尋ねていませんでしたが、KDEを実行している人は誰でも次のコマンドを使用できます。

kioclient exec <path-to-desktop-file>

Fedoraでは、これはkde-runtimerpmに含まれています。


5
それが機能するため、賛成。このプログラムがインストールされている限り、KDEを実行する必要はまったくありません。
basic6

これを標準化する方法はありますか?クレメンタインプレーヤーをコンパイルしました。これには、.desktopファイル(プラズマシェルを使用)からのみ起動するバグがあります。そして、私は、ログログを出力する方法を理解できませんでした。
クワッドペッパー

@Kwaadpepperでは、.desktopファイルを使用してシェルスクリプトを起動できます。シェルスクリプトは、コマンドを内部的に実行し、出力をファイルにリダイレクトします。
ラマン

現時点では、Arch Linux用のKDEパッケージにはkioclientが見つかりません。ただし、gtk-launchは私にとってはKDEで動作します。
MountainX

15

dexを使用できます。

dex foo.desktop

2
私見これはまさに正しい答えです。1つのツール、パラメータとしてファイルのみを使用した単一の呼び出し。それも、手書きの.desktopファイルをテストするために探していたものです。また、.desktopファイルも作成できます。:-)
アクセルベッカート

パーフェクト!dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 を使用する.desktopファイルを/ usr / share / applications /に追加すると、 デフォルトでgeditで開かなくてもファイルマネージャーでデスクトップファイルを起動できます。
スチュアートアクソン

13
exo-open [[path-to-a-desktop-file]...]

exo-utilsがインストールされている場合、Xubuntuの場合のように、13.10リリースで動作するようです。


はい、Ubuntu Studio 14.04でテストしました。ところで。xdg-openとgvfs-openもそこで機能します。
jarno 14年

15でも機能します
ジョナサン

Debianをxfceで使用します。よく働く!
king_julien

Ubuntu 14.04で動作します
タイラーコリアー

8

Hamishの回答の補遺。

deskopenスクリプトを指定すると、コメント文字がまだあるため、.desktopファイルのシェバン行としてそのスクリプトへの参照を使用できます#。つまり、これを.desktopファイルの最初の行として配置します。

#!/usr/bin/env deskopen

次に、.desktopファイルに実行可能ファイルとしてフラグを付けます(たとえば、chmod +x whatever.desktop)。

path/to/whatever.desktop

voilà-アプリが開きます!(方法はわかりませんが、指定したアイコンファイルで完了します。)

また、deskopenがコマンドラインパラメーターを通過させるようにしたい場合は、代わりにこのわずかに変更されたバージョンを使用できます。

#!/bin/sh
desktop_file=$1
shift
`grep '^Exec' "${desktop_file}" | sed 's/^Exec=//' | sed 's/%.//'` "$@" &

余談として、私"#{@:2}"shiftingの代わりに使用しようとしましたが、それは私に「悪い代用」を与え続けました...


これはHamishの答えに対するコメントとしてより適切であることがわかっていますが、私は新しいユーザーであり、コメントを許可されていません。しかたがない!
pabst

あなたが評判を持っている場合、最も適切なアクションは、実際にその答えを編集することです。
フリム

それを打つ、誰もが、ログインしていないユーザーであっても、編集を提案することができます!決して大したことではありません。
フリム

1
これはそれ自体で答えです、その罰金。
ブルーノペレイラ

"${@:1}"代わりに使用することができますがshift、それはあなたのシバンでのbash代わりに必要です。私見では、元のシフトアプローチはよりシンプルで優れていますsh#!
-MestreLion

6

現在、Ubuntuアーカイブで説明したことを実行するアプリケーションはありません。これらのXDG仕様に準拠していないデスクトップ環境(openboxなど)に統合を提供する一般的なソリューションを作成するために、いくつかの取り組みが進行中です。

Arch Linuxは、python-xdgライブラリに基づいたxdg-autostartの実装に取り​​組んでいます。私が見つけることができるものから、これはまだ完全に完全ではないようですが、成功のいくつかの報告があります。

また、広く使用することで恩恵を受ける可能性が高いと思われるxdg-autostartのC ++実装(http://gitorious.org/xdg-autostart/)もあります。

どちらかの解決策が役立つ場合は、DebianまたはUbuntuに含めるために必要な作業を提出することを検討してください。

openstartでいずれかのツールを使用するには、/ etc / xdg / openbox / autostart.shで呼び出します(openboxのドキュメントを正しく読んでいる場合)。これが機能しない場合は、おそらくopenboxセッション初期化スクリプトのいずれかで呼び出すことができます。


とにかく情報に感謝
-enzotib

6

「標準コマンドの使用」の要件を満たす即時解決策はありませんが、.desktopファイルを最小限に解析したい場合、またはBashエイリアスを作成したい場合は、次のように動作します。

  • awk -F= '/Exec=/{system($2); exit}' foo.desktop

興味深いかもしれないもう1つのアプローチはbinfmt-misc.desktopファイルの一致よりもカーネルレベルのメソッドを作成するgrep -r . /proc/sys/fs/binfmt_misc/ことです(現在有効にしているパターンを参照してください)。

一日の終わりには、何かがどこかで解析する必要があります.desktopファイルを、それがどのように「標準/デフォルト」の問題だけです。


面白い、ありがとう。「標準」とは、DEによって提供され、freedesktop.orgに準拠するものを意味します。
-enzotib

sとsのawkチェーンではなく賛成です。grepsed
jmtd

アップボット、ただし、複数行がある場合は機能しません(または配置した方がよい-機能しすぎます)Exec=:/
ボリスチャージン

2

上記のCarloの 回答からスクリプトを取得し、自分のデスクトップで使用するためにスクリプトの改善を試みました。

このバージョンのスクリプトを使用すると、最初の結果である可能性が高い限り、HUDで入力したかのようにアプリを実行できます。また、URIをサポートしない.desktopファイルのファイル引数を渡すこともできます。

#!/usr/bin/env python

from gi.repository import Gio
from argparse import ArgumentParser
import sys, os

def find_app(search_string):
    for group in Gio.DesktopAppInfo.search(search_string):
        for entry in group:
            try:
                return Gio.DesktopAppInfo.new(entry)
            except: pass
    return None

def main(args):
    launcher = None
    if os.path.isfile(args.appName):
        try:
        # If it's a file, do that first.
            launcher = Gio.DesktopAppInfo.new_from_filename(args.appName)
        except TypeError:
            print "'" + args.appName + "' is not a .desktop file"
            sys.exit(-1)
    # If it's a .desktop file in the DB, try using that
    if launcher is None and args.appName.endswith('.desktop'):
        try:
            launcher = Gio.DesktopAppInfo.new(args.appName)
        except TypeError: pass

    if launcher is None:
        # Search for the app by the text given
        launcher = find_app(args.appName)

    if launcher is None:
        print "No app named " + args.appName + " could be found"
        sys.exit(-1)
    if (launcher.supports_uris()):
        launcher.launch_uris(args.uris, None)
    elif (launcher.supports_files()):
        launcher.launch(list({ Gio.File.parse_name(x) for x in args.uris }), None)
    else :
        launcher.launch()

if __name__ == "__main__":
    argParser = ArgumentParser(description="Launch a .desktop file or application")
    argParser.add_argument("appName", 
        help="the name of any application, a desktop file's basename, or a concrete path to a desktop file", 
        action='store'
    )
    argParser.add_argument("uris", 
        nargs='*', 
        help="Files or URIs to pass to the application"
    )
    args = argParser.parse_args()
    main(args)

1

これらのファイルをテストするときに、DMまたはセッションマネージャーが期待どおりに動作することを確認する最も簡単な方法を見つけました。UIフォルダーブラウザーで周囲のディレクトリを開き、ダブルクリックして開きます。

コマンドラインを使用している場合:gvfs-open .またはgnome-open .構成済みのフォルダーブラウザーで開きます。

sedはDMの動作を反映しません。これには、エスケープなどの厄介なものや、代替動作が本当に必要ない場所を引用するなどが含まれます。コマンドラインではありませんが、物事を検証しました。また、設定Terminal=trueがデバッグに役立つこともわかりました。


ターミナルはすぐに消えます
。Terminal

1

このSOの答えは、私にとってそれを明確にしたものです:デスクトップファイルを実行しようとせず、デスクトップファイルで指し示されているファイルを実行してください。

たとえば、/ home / jsmith / Desktop / x11vnc.shを実行します

Exec=/home/jsmith/Desktop/x11vnc.sh

1

(ここの他のさまざまな回答からコンパイルされた)

システムと、システムに存在する場合と存在しない場合があるさまざまなバグに応じて、次のいずれかが機能するまで試してください。

  1. xdg-open program_name.desktop
  2. exo-open program_name.desktop
  3. gtk-launch program_name.desktop
  4. kioclient exec program_name.desktop
  5. dex program_name.desktop

Ubuntuシステムでは、「スタートメニュー」デスクトップランチャーがで利用できることに注意してください/usr/share/applications/

例として、上記のコマンドのどれが私のUbuntu 14.04システムで機能するか、または機能しないかを示すために、ここに私のための以下の呼び出しの結果があります:

  1. xdg-open /usr/share/applications/eclipse_for_cpp.desktop #バグが原因で失敗する(この.desktopファイルを保存してみてください)
  2. exo-open /usr/share/applications/eclipse_for_cpp.desktop #作品
  3. gtk-launch /usr/share/applications/eclipse_for_cpp.desktop #「gtk-launch:no such application」で失敗する
  4. kioclient exec /usr/share/applications/eclipse_for_cpp.desktop #作品
  5. dex /usr/share/applications/eclipse_for_cpp.desktop#失敗し、sudo apt install dexパッケージdexが見つからない

0

デスクトップファイルが指すスクリプトも実行可能であることを確認してください。

それでも動作しない場合。を変更してデスクトップファイルをターミナルで実行可能にしTerminal=true、bashスクリプト内に配置します。スクリプトを実行してエラー出力をキャッチします。エラーが修正されたら元に戻します。


0

Hamishの答えは素晴らしいですが、より少ないパイピングで、よりシンプルな代替案を提案したいと思います。

$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)

この場合、でawk始まる行を検索しExec、forループを使用してその行の後にフィールドを単に印刷し、=フィールド2、つまりそのフィールドの後にあるものを印刷します。コマンドの両端にある中括弧は、 $(...)パラメータ置換であるため、シェルはawkコマンドが返すものを実行します。この場合、後に来る実際のコマンドを返しますExec=

まれに、複数の=サインが存在する場合がありますが、それも可能性です。そのために、私はお勧めします

$(awk -F= '/^Exec/||/^TryExec/ {for(i=2;i<=NF;i++) print $i;exit}' /usr/share/applications/firefox.desktop)

ニース、awkSerg =)
AB

そして時には、TryExec2番目のコマンドを確認する必要があるかもしれません=)
AB

@AB Hehe、awkそれはテキスト処理に関して私が選んだ武器です。また、構文はに近いCです。ああ、すでに追加されていますTryExec^ _ ^
セルギー・コロディアズニー

あなたは)=私の1持っている
AB

しかし、何のことだ%f%u%Uまたはコマンドの後ろにこのような何か?
AB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.