Dari apa yang dapat saya kumpulkan, .desktop
file adalah pintasan yang memungkinkan pengaturan aplikasi disesuaikan. Misalnya, saya punya banyak di /usr/share/applications/
folder saya .
Jika saya membuka folder itu nautilus
, saya dapat menjalankan aplikasi ini hanya dengan mengklik dua kali file yang terkait, misalnya mengklik dua kali firefox.desktop
menjalankan Firefox. Namun, saya tidak dapat menemukan cara untuk melakukan hal yang sama melalui terminal.
Jika saya melakukannya gnome-open foo.desktop
cukup buka foo.desktop
sebagai file teks. Jika saya membuatnya dapat dieksekusi dan kemudian menjalankannya di bash hanya gagal (yang diharapkan, itu jelas bukan skrip bash).
EDIT: Melakukan exec /fullpath/foo.desktop
memberi saya Permission denied
pesan, bahkan jika saya mengubah kepemilikan untuk diri saya sendiri. Jika saya membuat executable dan melakukan perintah yang sama, tab terminal yang saya gunakan cukup ditutup (saya kira itu crash). Akhirnya, jika saya lakukan sudo exec /fullpath/foo.desktop
, saya mendapatkan pelaporan kesalahan sudo: exec: command not found
.
Itu pertanyaan saya, bagaimana saya bisa menjalankan foo.desktop
file dari terminal?
sumber
exec
kegagalan Anda adalah karena exec mengganti proses yang sedang berjalan dengan proses yang Anda tentukan, jadi yang Anda lakukan adalah mencoba mengganti shell Anda dengan menjalankan desktop sebagai biner yang dikompilasi. Alasan Anda tidak bisasudo exec
karena itu adalah builtin shell dan bukan perintah biner.Jawaban:
Perintah yang dijalankan terdapat di dalam file desktop, didahului oleh
Exec=
sehingga Anda dapat mengekstrak dan menjalankannya dengan:Untuk memecahnya
Anda bisa meletakkan ini di file, katakan
~/bin/deskopen
dengan kontenKemudian buat itu bisa dieksekusi
Dan kemudian Anda bisa melakukannya, misalnya
Argumen (
%u
,%F
dll) dirinci di http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables - tidak ada satupun yang relevan untuk diluncurkan di baris perintah .sumber
grep '^Exec' firefox.desktop | sed 's/^Exec=//'
membuka Firefox dengan tab yang memuat www.% U.com .sed
untuk menghapus argumen apa pun. Tapi saya pikir mungkin ada cara yang lebih "alami" untuk menjalankannya..desktop
file sederhana , tetapi mengabaikan entri sepertiPath=
danTryExec=
yang dapat mempengaruhi eksekusi. Ini juga mengeksekusi yang salahExec=
jika file tersebut berisi Tindakan Desktop ("daftar cepat")Jawabannya seharusnya
Tetapi karena bug ini tidak lagi berfungsi.
sumber
exo-open
terdaftar sebagai solusi dan juga membuka gedit. :(gnome-open
tidak tidak menyebutnyaxdg-open
, itu sebaliknya! Jadi masalahnya terletak padagvfs-open
(penerus ataugnome-open
)xdg-open
berfungsi oleh asosiasi mimetype, dan.desktop
file dikaitkan dengan editor teks, karena mereka adalah subkelas teksDengan setiap ubuntu terbaru yang mendukung
gtk-launch
cukup pergigtk-launch <file>
di mana nama file .desktop dengan atau tanpa.desktop
bagianJadi
gtk-launch foo
terbukafoo.desktop
(
gtk-launch
dokumentasi ).Desktop harus di / usr / share / aplikasi, / usr / local / share / aplikasi atau ~ / .local / share / aplikasi
Dapat digunakan dari terminal atau alt + F2 (alt + F2 menyimpan perintah dalam sejarah sehingga mudah diakses)
sumber
Sampai hari ini (12.10) bug masih ada. Itu sebenarnya tergantung pada bagaimana
gvfs-open
(dipanggil olehxdg-open
) bekerja.Namun, saya berhasil menyelesaikannya dengan cepat (mencuri inspirasi dari kode sumber nautilus). Ini agak berbelit-belit, tetapi bekerja dengan sempurna di Ubuntu 12.10, menambahkan ikon yang bermakna (tidak lebih
?
) pada peluncur Unity.Pertama, saya menulis skrip python menggunakan Gio dan menempatkannya sebagai
~/bin/run-desktop
:Skrip harus memiliki izin yang dapat dieksekusi, jadi saya menjalankan ini di terminal:
Lalu saya membuat
.desktop
entri relatif pada~/.local/share/applications/run-desktop.desktop
:Akhirnya saya menghubungkan entri sebagai pengendali default di
~/.local/share/applications/mimeapps.list
bawah[Default Applications]
bagian sebagai:Sekarang:
xdg-open
something.desktop berfungsi seperti yang diharapkan#!/usr/bin/xdg-open
hashbang di atas entri desktop yang dapat dieksekusi juga berfungsiIni akan menjadi pekerjaan sia-sia ketika
gvfs-open
akan menyelesaikan bug, tetapi sementara itu ...sumber
Exec=
baris dan%
parameter dalam perintah dengan benar./usr/bin/xdg-openpy
, dan memberinyachmod +x
- dan digunakanlauncher.launch([],context)
sebagai gantinya...None,context)
(karena " TypeError: argumen 1: Harus berurutan, bukan NoneType "). Sekarangxdg-openpy app.desktop
berfungsi dari baris perintah (dan semua seperti biasa ketika mengklik dua kaliapp.desktop
), dan itu dapat mengingatkan saya jika saya mencoba menelepon terminalxdg-open
dan tekan tab. Tepuk tangan!.desktop
file secara manual , jadi ini adalah pendekatan yang paling waras (dan aman). Juga menggunakan modern,gi.repository
bukan usangpygtk
, begitu hebat! :)Jalan yang benar
Anda harus benar-benar menggunakan
gtk-launch
jika tersedia. Biasanya merupakan bagian dari paket libgtk-3-bin (ini mungkin berbeda-beda menurut distro).gtk-launch
digunakan sebagai berikut:Harap dicatat bahwa
gtk-launch
memerlukan file .desktop untuk diinstal (yaitu terletak di/usr/share/applications
atau~/.local/share/applications
)Jadi untuk menyiasatinya, kita dapat menggunakan fungsi Bash kecil yang bersifat sementara yang menginstal sementara file .desktop yang diinginkan sebelum meluncurkannya. Cara "benar" untuk menginstal file .desktop adalah melalui
desktop-file-install
tetapi saya akan mengabaikannya.Anda dapat menggunakannya seperti itu (dan juga berikan argumen tambahan atau URI jika Anda mau):
Alternatif Manual
Jika Anda ingin mem-parsing dan mengeksekusi file .desktop secara manual , Anda dapat melakukannya dengan
awk
perintah berikut :Jika Anda ingin memperlakukan
awk
perintah seperti skrip all-in-one; kita bahkan dapat menampilkan pesan kesalahan dan keluar dengan kode pengembalian 1 jika perintah Exec tidak ditemukan:Perintah-perintah tersebut akan:
%f
,%u
,%U
). Dimungkinkan untuk mengganti ini dengan argumen posisional sesuai spesifikasi yang dimaksudkan, tetapi melakukan hal itu akan menambah kompleksitas yang signifikan pada masalah. Lihat Spesifikasi Entri Desktop terbaru .Catatan, skrip AWK ini membahas beberapa kasus tepi yang mungkin atau mungkin tidak ditangani dengan benar oleh beberapa jawaban lainnya. Secara khusus, perintah ini menghapus beberapa variabel Exec (berhati-hati untuk tidak menghilangkan simbol%), hanya akan mengeksekusi satu perintah baris Exec , dan akan berperilaku seperti yang diharapkan bahkan jika perintah baris Exec berisi satu atau lebih tanda sama dengan (misalnya
script.py --profile=name
).Hanya beberapa peringatan lainnya ... Menurut spesifikasi, TryExec adalah:
Dengan pemikiran itu, tidak masuk akal untuk mengeksekusi nilainya.
Beberapa masalah lain adalah Path dan Terminal . Path terdiri dari direktori kerja untuk menjalankan program. Terminal adalah boolean yang menunjukkan apakah program dijalankan di jendela terminal. Ini semua dapat diatasi, tetapi tidak ada gunanya menciptakan kembali roda karena sudah ada implementasi dari spesifikasi. Jika Anda ingin mengimplementasikan Path , perlu diingat bahwa
system()
memunculkan subproses, sehingga Anda tidak dapat mengubah direktori kerja dengan melakukan sesuatu sepertisystem("cd \047" working_directory "\047"); system(command)
. Namun Anda mungkin bisa melakukan sesuatu sepertisystem("cd \047" working_directory "\047 && " command)
. Catatan \ 047 adalah tanda kutip tunggal (sehingga perintah tidak memecah jalur dengan spasi).Alternatif Python
Saya mencuri halaman dari Carlo di sini , yang menyarankan untuk membuat skrip Python untuk menggunakan modul gi . Inilah cara minimal untuk mengeksekusi kode yang sama dari shell tanpa harus membuat file dan khawatir tentang I / O.
Kemudian jalankan fungsi launcher sebagai berikut:
Perhatikan bahwa penggunaan URI bersifat opsional. Selain itu, tidak ada pemeriksaan kesalahan yang dilakukan sehingga Anda ingin memastikan peluncur ada dan dapat dibaca (sebelum menggunakannya) jika Anda ingin skrip Anda tahan lama.
sumber
awk
perintahnya bagus. Oleh karena itu +1awk
solusi tidak akan benar bekerja jika perintah memiliki spasi putih ganda melarikan diri atau garis miring terbalik. Itu rusak pada ini:Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnk
Dandex
solusi berfungsi dengan baik.Sementara OP tidak bertanya tentang KDE, bagi siapa pun yang menjalankan KDE, perintah berikut dapat digunakan:
kioclient exec <path-to-desktop-file>
Di Fedora, ini termasuk dalam
kde-runtime
rpm.sumber
Anda bisa menggunakan dex .
sumber
.desktop
file tulisan tangan . Dan itu bisa membuat.desktop
file juga, yay! :-)tampaknya bekerja di rilis 13.10, jika exo-utils diinstal (seperti halnya dengan Xubuntu).
sumber
Tambahan untuk jawaban Hamish.
Dengan skrip deskopen, Anda dapat menggunakan referensi sebagai skrip shebang dalam file .desktop , karena karakter komentarnya masih
#
. Artinya, letakkan ini sebagai baris pertama dari file .desktop :Kemudian tandai file .desktop sebagai yang dapat dieksekusi (mis. Dengan a
chmod +x whatever.desktop
), dan kemudian Anda bisadan voila - Aplikasi akan terbuka! (Lengkap dengan file ikon yang saya tentukan, meskipun saya tidak tahu caranya.)
Sekarang, jika Anda juga ingin deskopen melewati parameter baris perintah apa pun, Anda bisa menggunakan versi yang sedikit dimodifikasi ini:
Sebagai tambahan, saya mencoba menggunakan
"#{@:2}"
bukannyashift
, tetapi terus memberi saya 'substitusi buruk' ...sumber
"${@:1}"
alih-alihshift
, tapi itu membutuhkanbash
alih-alihsh
di#!
shebang Anda . IMHO pendekatan pergeseran asli Anda lebih sederhana dan lebih baikSaat ini tidak ada aplikasi yang melakukan apa yang Anda jelaskan di arsip Ubuntu. Ada beberapa upaya yang sedang berlangsung untuk menciptakan solusi umum untuk menyediakan integrasi untuk lingkungan desktop (seperti openbox) yang tidak sesuai dengan spesifikasi XDG ini.
Arch Linux sedang mengerjakan implementasi xdg-autostart berdasarkan pustaka python-xdg. Dari apa yang dapat saya temukan, ini tampaknya belum sepenuhnya lengkap, tetapi memiliki beberapa laporan keberhasilan.
Ada juga implementasi C ++ dari xdg-autostart di gitorious (http://gitorious.org/xdg-autostart/) yang kemungkinan akan mendapat manfaat dari penggunaan yang lebih luas.
Jika salah satu solusi bekerja untuk Anda, harap pertimbangkan untuk mengirimkan karya yang diperlukan untuk dimasukkan dalam Debian atau Ubuntu.
Untuk menggunakan salah satu alat dengan openstart, Anda akan menyebutnya di /etc/xdg/openbox/autostart.sh (jika saya membaca dokumentasi openbox dengan benar). Jika ini tidak berhasil, Anda mungkin dapat menyebutnya di salah satu skrip inisialisasi sesi kotak terbuka.
sumber
Saya tidak memiliki solusi segera yang memenuhi persyaratan untuk "menggunakan perintah standar" , tetapi jika Anda memang ingin mem-parsing
.desktop
file - file minimal atau ingin membuat alias Bash, maka yang berikut ini akan berfungsi:awk -F= '/Exec=/{system($2); exit}' foo.desktop
pendekatan lain yang mungkin menarik, adalah membuat
binfmt-misc
metode tingkat kernel dari kecocokan pada.desktop
file (lihatgrep -r . /proc/sys/fs/binfmt_misc/
pola-pola yang saat ini Anda aktifkan).Pada akhir hari, sesuatu di suatu tempat harus mengurai
.desktop
file, itu hanya pertanyaan tentang bagaimana "standar / standar" itu.sumber
awk
daripada rantaigrep
s dansed
s.Exec=
barisSaya mengambil skrip dari jawaban Carlo di atas, dan berupaya memperbaikinya untuk penggunaan desktop saya sendiri.
Versi skrip ini akan memungkinkan Anda untuk menjalankan aplikasi apa pun seolah-olah Anda memasukkannya di HUD, asalkan itu kemungkinan akan menjadi hasil pertama. Ini juga memungkinkan Anda menyampaikan argumen file untuk file .desktop yang tidak mendukung URI.
sumber
Ketika mencoba untuk menguji file-file ini, saya menemukan cara paling sederhana untuk memeriksa bahwa DM atau manajer sesi akan melakukan apa yang saya harapkan adalah membuka direktori di sekitarnya di browser folder UI dan kemudian klik dua kali untuk membukanya.
Jika Anda berada di baris perintah:
gvfs-open .
ataugnome-open .
akan membukanya di browser folder yang dikonfigurasi.Hal sed tidak akan mencerminkan perilaku DM, termasuk hal-hal fiddly seperti melarikan diri dan mengutip di mana Anda benar-benar tidak ingin perilaku alternatif. Ini bukan baris perintah, tetapi memang memvalidasi hal-hal. Saya juga menemukan pengaturan
Terminal=true
berguna untuk debugging.sumber
Ini SO jawabannya adalah apa yang membuat jelas bagi saya: jangan mencoba untuk menjalankan file desktop mengeksekusi file tersebut menunjuk pada desktop file.
Sebagai contoh, jalankan / home / jsmith/Desktop/x11vnc.sh
sumber
(Disusun dari berbagai jawaban lain di sini)
Bergantung pada sistem Anda, dan berbagai bug yang mungkin atau mungkin tidak ada pada sistem Anda, coba yang berikut sampai salah satu dari mereka bekerja:
xdg-open program_name.desktop
exo-open program_name.desktop
gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop
Perhatikan bahwa pada sistem Ubuntu, peluncur desktop "menu mulai" Anda tersedia di
/usr/share/applications/
.Sebagai contoh, untuk menunjukkan perintah mana di atas yang berfungsi atau tidak bekerja pada sistem Ubuntu 14.04 saya, inilah hasil dari panggilan berikut untuk saya:
xdg-open /usr/share/applications/eclipse_for_cpp.desktop
# Gagal karena bug (mencoba agar saya menyimpan file .desktop ini)exo-open /usr/share/applications/eclipse_for_cpp.desktop
# Bekerjagtk-launch /usr/share/applications/eclipse_for_cpp.desktop
# Gagal dengan "gtk-launch: no application like"kioclient exec /usr/share/applications/eclipse_for_cpp.desktop
# Bekerjadex /usr/share/applications/eclipse_for_cpp.desktop
# Gagal, &sudo apt install dex
tidak dapat menemukan paket dexsumber
Pastikan skrip yang ditunjukkan file desktop Anda juga dapat dieksekusi.
Jika masih tidak berhasil. Buat file desktop dapat dijalankan di terminal dengan mengubah
Terminal=true
, dan memasukkannya ke dalam skrip bash. Jalankan skrip untuk menangkap output kesalahan. Ubah kembali ketika kesalahan diperbaiki.sumber
Jawaban Hamish sangat bagus, tetapi saya ingin menyarankan alternatif yang lebih sederhana, dengan sedikit melibatkan:
$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)
Dalam hal ini,
awk
cari baris yang dimulai denganExec
, dan kemudian kita cukup mencetak bidang setelah baris itu, menggunakan untuk loop dan=
kita mencetak bidang 2, yaitu, apa pun yang muncul setelah bidang itu. Kurung keriting di ujung perintah$(...)
,, adalah substitusi parameter, sehingga shell akan mengeksekusi perintah awk apa pun; dalam hal ini, ia mengembalikan perintah aktual yang datang setelahExec=
.Dalam beberapa kasus yang jarang terjadi mungkin ada lebih dari satu
=
tanda, yang masih memungkinkan. Untuk itu, saya sarankansumber
awk
and Serg =)TryExec
, mungkin Anda harus memeriksa perintah ke-2 Anda =)awk
adalah senjata pilihan saya dalam hal pemrosesan teks. Selain itu, sintaksinya dekatC
. Oh, dan sudah menambahkanTryExec
bagian ^ _ ^%f
,%u
,%U
atau sesuatu seperti ini di belakang perintah?