是否有任何命令可以自动从 .jar 文件创建 .desktop 文件?

是否有任何命令可以自动从 .jar 文件创建 .desktop 文件?

我玩很多基于 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///- 例如,您不能用作/路径名中的分隔符,因为/它是路径名分隔符,您必须使用:=保证不在变量中的其他一些字符

使用 perl 而不是 bash + sed 可以避免所有这些麻烦。

下面的示例只是模板脚本的最低限度示例。对于更复杂的工作,我倾向于使用 Perl 的优秀模板库模块之一,例如文本::模板,但这对于像这样简单的事情来说就太过分了。

基本思想是创建一个文本文件(或脚本内的定界符,或包含多行字符串的变量,或每个元素包含一行模板的数组等),其中包含您所要内容的通用版本想要生成,其中的不同部分被一些文本替换,这些文本稍后将被变量替换。

可替换的文字可以是任何你喜欢的东西,但是必须是模板文件或任何变量数据中其他地方不会出现的内容。

我倾向于使用两个下划线和一个名称,后跟另外两个下划线(例如__ICON__),除非我生成的程序代码中可能包含此类字符串(例如作为常量或变量名称)。

您可以拥有您喜欢的任何固定/静态文本,以及您喜欢的任何可变/可替换部分。

然后,您编写一个脚本,将所有这些可替换文本位替换为变量中包含的值。

例如,编写一个如下所示的简单脚本,将其命名为“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变量内的文本替换为实际桌面文件之一的副本,并对其进行编辑以具有适当的可替换文本。根据需要创建变量(及其可替换的文本模式)。

并像这样运行它:

$ ./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”并打开该文件进行写入和打印,而不是打印到标准输出。


这是一个更简单的版本,它不执行多个正则表达式搜索和替换操作(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 文件,添加一个或多个条目,然后运行脚本——它只会生成新的 .desktop 文件。

相关内容