저는 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의 뛰어난 템플릿 라이브러리 모듈 중 하나를 사용하는 경향이 있습니다.텍스트::템플릿, 하지만 이렇게 간단한 것에는 과잉입니다.
기본 아이디어는 원하는 내용의 일반 버전을 포함하는 텍스트 파일(또는 스크립트 내의 구분 기호, 여러 줄 문자열을 포함하는 변수, 요소당 한 줄의 템플릿을 포함하는 배열 등)을 만드는 것입니다. 의 다른 부분은 나중에 변수로 대체될 일부 텍스트로 대체됩니다.
교체 가능한 텍스트할 수 있는당신이 좋아하는 것은 무엇이든 될 수 있지만,~ 해야 하다템플릿 파일이나 변수 데이터의 다른 곳에는 나타나지 않는 것입니다.
__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"을 사용하고 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 파일을 편집하고 하나 이상의 항목을 추가한 다음 실행할 수 있습니다. 스크립트 - 새로운 .desktop 파일을 생성합니다.