Doğru yol
gtk-launch
Mümkünse , gerçekten kullanıyor olmalısınız . Genellikle libgtk-3-bin paketinin bir parçasıdır ( dağıtımdan farklılık gösterebilir).
gtk-launch
aşağıdaki gibi kullanılır:
gtk-launch APPLICATION [URI...]
gtk-launch app-name.desktop
gtk-launch app-name
Lütfen .desktop dosyasının yüklenmesini gtk-launch
gerektirir (örn. Veya içinde bulunur )./usr/share/applications
~/.local/share/applications
Bu yüzden, bunun üstesinden gelmek için, başlatılmadan önce istenen .desktop dosyasını geçici olarak yükleyen, küçük bir Bash işlevini kullanabiliriz . Bir .desktop dosyasını kurmanın "doğru" yolu bittidesktop-file-install
ama bunu görmezden geleceğim.
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
)
}
Bunun gibi kullanabilirsiniz (ve isterseniz ek argümanlar veya URI'ler boyunca da iletin):
launch PATH [URI...]
launch ./path/to/shortcut.desktop
Manuel Alternatif
Bir .desktop dosyasını el ile çözümlemek ve yürütmek istiyorsanız, aşağıdaki awk
komutu kullanarak yapabilirsiniz :
awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system($0)}' app-name.desktop
awk
Komutu hepsi bir arada bir komut dosyası gibi ele almak istiyorsanız ; Bir Exec komutunun bulunamaması durumunda bir hata mesajı gösterebilir ve 1 dönüş kodu ile çıkabiliriz :
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}}'
Yukarıda belirtilen komutlar:
- Exec ile başlayan satırı bul =
- Exec Kaldır =
- Herhangi Exec değişkenleri çıkarın (örneğin
%f
, %u
, %U
). Şartnamenin öngördüğü şekilde bunları konumsal argümanlarla değiştirmek mümkündür, ancak bunu yapmak soruna önemli bir karmaşıklık katacaktır. En son Masaüstü Giriş Belirtimi bölümüne bakın .
- Komutu yürütün
- Hemen uygun çıkış koduyla çıkın (birden fazla Exec satırı çalıştırmamak için )
Not, bu AWK betiğinin, diğer cevapların bir kısmı tarafından düzgün bir şekilde ele alınabilecek veya cevaplanamayacağı birkaç son durumu ele aldığını unutmayın. Özellikle, bu komut birden fazla Exec değişkenini kaldırır (% sembolünü başka şekilde kaldırmamaya dikkat ederek), yalnızca tek bir Exec line komutu yürütür ve Exec line komutu bir veya daha fazla eşittir işareti (örn. script.py --profile=name
) İçeriyorsa bile beklendiği gibi davranır .
Sadece birkaç diğer uyarılar ... Şartnameye göre, TryExec :
Programın gerçekten yüklü olup olmadığını belirlemek için kullanılan diskteki yürütülebilir bir dosyanın yolu. Yol mutlak bir yol değilse, dosya $ PATH ortam değişkeninde aranır. Dosya yoksa veya çalıştırılabilir değilse, giriş göz ardı edilebilir (örneğin menülerde kullanılmaz).
Bunu akılda tutarak, değerini uygulamak mantıklı değil.
Diğer bazı endişeler Yol ve Terminal'dir . Yol , programı çalıştırmak için kullanılan çalışma dizininden oluşur. Terminal , programın bir terminal penceresinde çalıştırılıp çalıştırılmadığını gösteren bir booleandır. Bunların hepsi ele alınabilir, ancak spesifikasyonun hali hazırda uygulamaları olduğu için tekerleği yeniden icat etmenin bir anlamı yoktur. Path uygulamasını uygulamak istiyorsanız , system()
bir alt işlemi başlatacağını unutmayın , böylece çalışma dizinini benzer bir şey yaparak değiştiremezsiniz system("cd \047" working_directory "\047"); system(command)
. Ancak, muhtemelen bir şeyler yapabilirsin system("cd \047" working_directory "\047 && " command)
. Not \ 047 tek tırnak işaretidir (bu nedenle komut boşluk içeren yollarda kesilmez).
Python Alternatif
Burada Carlo’dan bir sayfa çalıyorum , ki gi modülünü kullanmak için bir Python betiği yaratmayı önerdi . İşte aynı kodu kabuktan bir dosya oluşturmadan ve G / Ç hakkında endişelenmenize gerek kalmadan yürütmek için minimal bir yol.
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
}
Sonra başlatıcı işlevini aşağıdaki gibi yürütün:
launch ./path/to/shortcut.desktop
URI kullanımının isteğe bağlı olduğunu unutmayın. Ayrıca, hiçbir hata kontrolü yapılmaz, bu nedenle, başlatıcınızın var olduğundan ve komut dosyanızın dayanıklı olmasını istiyorsanız okunabilir olmasını sağlamak isteyebilirsiniz.
exec
Başarısız olmanızın nedeni, yürütmenin şu anda çalışan işleminizi belirttiğiniz işlemle değiştirmesidir, bu nedenle yaptığınız işlem, kabuğunuzu derlenmiş bir ikili olarak çalıştırarak masaüstünü değiştirmeye çalışmaktı. Yapamamanın nedenisudo exec
, bir kabuğun yerleşik olduğu ve ikili bir komut olmadığıdır.