私はJavaベースのゲームをたくさんしています。入力がjava -jar name-of-game.jar
面倒で、ファイルを手動で生成するユーザーエクスペリエンスが.desktop
面倒であることがわかりました。自動.desktop
発電機はありますか?
答え1
別のアプローチは、システムにjar
ファイルを直接実行する方法を教えることです。その後、デスクトップファイルを作成せずにアプリケーションを直接実行できます。
apt install binfmt-support # Once, as root
chmod u+x name-of-game.jar # Once, for each jar
これでjar
ファイルを直接実行できます。例えば
./name-of-game.jar
または、ファイルマネージャで直接ファイルをダブルクリックします。
パッケージがすでにインストールされている可能性がありますbinfmt-support
。
答え2
いいえ、ただし、.desktopファイルがいくつかの違い(つまり変数)を除いて95%以上同じであることを考慮すると、bash + sed、awk、またはperlを使用して単純なテンプレートスクリプトを作成するのは非常に簡単です。
つまり、反復的で退屈な作業を自動化するツールを直接作成するのは簡単です。
perl
Perlはすべてのテキスト処理タスクに優れたツールであるため、これを使用します。この特定のテンプレートは非常に簡単に動作し、次のことができます。できるbashとsedを使用するが変数を引用し、操作に使用する区切り文字に注意する必要があります。たとえば、パス名の区切り文字であるため、パス名の区切り文字としてsed
s///
使用することはできません。またはまたはを使用する必要があります。/
/
:
=
変数に含まれていない他のいくつかの文字が保証されます。。
これらの問題をすべて回避するには、bash + sedの代わりにperlを使用してください。
次の例は、テンプレートスクリプトの最小限の例にすぎません。より複雑な作業のためには、Perlの優れたテンプレートライブラリモジュールの1つを使用する傾向があります。テキスト::テンプレートしかし、これは簡単なことに過剰です。
基本的なアイデアは、目的のコンテンツの一般的なバージョンを含むテキストファイル(またはスクリプト内の区切り文字、複数行の文字列を含む変数、要素ごとに1行のテンプレートを含む配列など)を作成することです。の別の部分は、後で変数に置き換えられるいくつかのテキストで置き換えられます。
交換可能なテキストできる好きなものは何でもいいけど、〜しなければならないテンプレートファイルや変数データの他の場所には表示されません。
__ICON__
私は、これらの文字列(定数や変数名など)を含むことができるプログラムコードを生成しない限り、2つのアンダースコアと名前の後に2つのアンダースコアを追加する傾向があります(例:)。
必要な固定/静的テキストと目的の変数/交換可能セクションを持つことができます。
次に、置換可能テキストのすべての部分を変数に含まれる値に置き換えるスクリプトを作成します。
たとえば、次の簡単なスクリプトを作成し、名前を「gen-desktop.pl」と指定し、次のコマンドを使用して実行可能にしますchmod +x
。
#!/usr/bin/perl
use strict;
# Very primitive arg handling. Should use Getopt::Std,
# Getopt::Long, or similar. Or read the variables from a CSV
# file or something.
#
# should also do some error checking/data validation. left as
# exercise for the reader :-)
my $exec = shift;
my $name = shift;
my $icon = shift;
# you could read the template from a file instead
# of hard-coding it in the script with a heredoc.
my $template = <<EOF;
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=__EXEC__
Name=__NAME__
Icon=__ICON__
EOF
# make a copy of the template and modify it
my $output = $template;
$output =~ s/__EXEC__/$exec/g;
$output =~ s/__NAME__/$name/g;
$output =~ s/__ICON__/$icon/g;
print $output;
注:$template
変数内のテキストを実際のデスクトップファイルの1つのコピーに置き換え、適切な置換可能なテキストを持つように編集する必要があります。必要に応じて変数(および置換可能なテキストパターン)を作成します。
次のように実行してください。
$ ./gen-desktop.pl "/path/to/executable args" "name of game" "icon for game"
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=/path/to/executable args
Name=name of game
Icon=icon for game
上記のスクリプトは、変更されたテンプレートを標準出力に出力します(出力を確認して正しいことを確認できるように)。今後ファイルとして保存してください)実行するときは、出力を.desktopファイル(たとえば~/Desktop/game.desktop
)にリダイレクトする必要があります。
より良いバージョンでは、出力ファイル名を別の引数として使用したり、「~/Desktop/$n.desktop」を使用してstdoutとして印刷する代わりに、書き込みおよび印刷用にそのファイルを開くことができます。
s/search/replace/
以下は、複数の正規表現検索と置換操作()を実行せずにコマンドライン引数をテンプレートheredocに直接挿入するより簡単なバージョンです。
#!/usr/bin/perl
print <<__EOF__;
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=$ARGV[0]
Name=$ARGV[1]
Icon=$ARGV[2]
__EOF__
最初のバージョンとまったく同じ出力を生成します。作業は完了しますが、柔軟性が低下します。
この直接補間バージョンのbashの実装は簡単です。
#!/bin/bash
cat << EOF
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=$1
Name=$2
Icon=$3
EOF
一度に多数の .desktop ファイルを一括生成する場合は、スクリプトから CSV またはタブ区切りのファイルを読み込み、各入力行に対して .desktop ファイルを生成することができます。 テキスト::CSVこれらのファイルを処理するのに最適なモジュールです(そして名前にもかかわらず、タブや他の文字を区切り文字として使用することもできます)/
スクリプトはCSVまたはタブ区切りファイルの各行を繰り返し、ここからデータを抽出し、s///
テンプレートにジョブを適用して、出力ファイルに印刷する必要があります。
つまり、上記の例との唯一の実際の違いは、コマンドライン引数の代わりにファイルから変数データを取得することです。
書き込み用に開く前に各出力ファイルがあることを確認するためにこのバージョンのスクリプトを作成すると、存在するすべてのファイルをスキップできます。 .CSVファイルを編集し、1つ以上のエントリを追加して実行できます。スクリプト - 新しい .desktop ファイルを生成します。