Chạy tệp .desktop trong thiết bị đầu cuối


141

Từ những gì tôi có thể thu thập, .desktopcác tệp là các phím tắt cho phép tùy chỉnh cài đặt của ứng dụng. Ví dụ, tôi có rất nhiều trong số họ trong /usr/share/applications/thư mục của tôi .

Nếu tôi mở thư mục đó nautilus, tôi có thể chạy các ứng dụng này chỉ bằng cách nhấp đúp vào tệp được liên kết của nó, ví dụ: nhấp đúp để firefox.desktopchạy Firefox. Tuy nhiên, tôi không thể tìm ra cách để làm điều tương tự thông qua thiết bị đầu cuối.

Nếu tôi làm gnome-open foo.desktopnó chỉ đơn giản là mở foo.desktopnhư một tập tin văn bản. Nếu tôi làm cho nó có thể thực thi được và sau đó chạy nó trong bash thì nó chỉ đơn giản là thất bại (dự kiến, rõ ràng đó không phải là bash script).
EDIT: Làm exec /fullpath/foo.desktopcho tôi một Permission deniedtin nhắn, ngay cả khi tôi thay đổi quyền sở hữu với chính mình. Nếu tôi thực hiện được và thực hiện cùng một lệnh, tab thiết bị đầu cuối tôi đang sử dụng chỉ đơn giản là đóng lại (tôi đoán nó bị sập). Cuối cùng, nếu tôi làm sudo exec /fullpath/foo.desktop, tôi nhận được một báo cáo lỗi sudo: exec: command not found.

Đó là câu hỏi của tôi, làm thế nào tôi có thể chạy một foo.desktoptập tin từ thiết bị đầu cuối?


5
Lưu ý: Lý do execthất bại của bạn là do exec thay thế quy trình hiện đang chạy của bạn bằng quy trình bạn chỉ định, vì vậy những gì bạn đã làm là cố gắng thay thế trình bao của bạn bằng cách chạy máy tính để bàn dưới dạng nhị phân được biên dịch. Lý do bạn không thể sudo execlà vì nó được tích hợp sẵn chứ không phải lệnh nhị phân.
Daenyth

Thú vị, tôi đã tự hỏi tại sao nó làm cho các tab đóng.
Malabarba


Tôi thấy, cuối cùng họ phân tích tệp .desktop. Dù sao cũng cảm ơn bạn đã liên kết.
enzotib

Người điều hành: Rất tiếc, tôi nghĩ rằng tôi có thể đã vô tình gắn cờ này, xin lỗi nếu đó là trường hợp
Croad Lang Sơn

Câu trả lời:


54

Lệnh được chạy được chứa trong tệp máy tính để bàn, trước Exec=đó để bạn có thể trích xuất và chạy lệnh đó bằng cách:

`grep '^Exec' filename.desktop | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g'` &

Để phá vỡ nó

grep  '^Exec' filename.desktop    - finds the line which starts with Exec
| tail -1                         - only use the last line, in case there are multiple
| sed 's/^Exec=//'                - removes the Exec from the start of the line
| sed 's/%.//'                    - removes any arguments - %u, %f etc
| sed 's/^"//g' | sed 's/" *$//g' - removes " around command (if present)
`...`                             - means run the result of the command run here
&                                 - at the end means run it in the background

Bạn có thể đặt nó trong một tập tin, nói ~/bin/deskopenvới nội dung

#!/bin/sh
`grep '^Exec' $1 | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g'` &

Sau đó làm cho nó thực thi

chmod +x ~/bin/deskopen

Và sau đó bạn có thể làm, ví dụ

deskopen /usr/share/applications/ubuntu-about.desktop

Các đối số ( %u, %Fv.v.) được nêu chi tiết tại http://stiterias.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variabled - không ai trong số chúng có liên quan để khởi chạy tại dòng lệnh .


Điều này cho kết quả tốt nhất cho đến nay, nhưng đôi khi nó tạo ra hành vi không mong muốn. Nó xảy ra bất cứ khi nào dòng "Exec =" có đối số như% u hoặc% i. Bash cố gắng vượt qua chuỗi đó như một đối số thông thường. Chẳng hạn, việc grep '^Exec' firefox.desktop | sed 's/^Exec=//'mở Firefox bằng một tab tải www.% U.com .
Malabarba

Hiện tại tôi đã thêm một giây sedđể xóa mọi đối số. Nhưng tôi nghĩ có thể có một cách "tự nhiên" hơn để chạy nó.
Malabarba

Tôi đã cập nhật câu trả lời của mình với sed thêm - Tôi quên các tệp máy tính để bàn có thể có đối số.
Hamish Downer

Bạn nên thêm "đuôi -1" vào đường ống sau "grep", vì "Exec =" có thể xuất hiện nhiều lần và sau đó, chỉ nên xuất hiện lần xuất hiện cuối cùng ..
daisy

13
-1: Điều này có thể hoạt động đối với .desktopcác tệp đơn giản , nhưng nó bỏ qua các mục như Path=TryExec=có thể ảnh hưởng đến việc thực thi. Nó cũng thực thi sai Exec=nếu tệp chứa Hành động trên màn hình ("danh sách nhanh")
MestreLion

85

Câu trả lời nên là

xdg-open program_name.desktop

Nhưng do một lỗi này không còn hoạt động.


7
WoW đây vẫn là một lỗi, rất nhiều tiến bộ trong xdg. exo-openđược liệt kê như cách giải quyết và nó cũng mở gedit. :(
vẽ

1
@RichardHolloway: gnome-openkhông không gọi xdg-open, đó là cách khác xung quanh! Vì vậy, vấn đề nằm ở gvfs-open(người kế vị hoặc gnome-open)
MestreLion

13
"công việc ngắn hạn"? Nó không bao giờ làm! xdg-openhoạt động bởi liên kết mimetype và .desktopcác tệp được liên kết với trình soạn thảo văn bản, vì chúng là một lớp con của văn bản
MestreLion

13
Điều này thật ngu ngốc (không có cách nào hợp lý để chạy tệp Desktop từ thiết bị đầu cuối)
Sam Watkins

2
Hoạt động với tôi trên Arch Linux, nhưng có lẽ đó là một lỗi cụ thể của Ubuntu.
Victor

75

Với bất kỳ Ubuntu nào gần đây hỗ trợ gtk-launchchỉ đơn giản là đi

gtk-launch <file>tên của tệp .desktop có hoặc không có .desktopphần

Vì vậy, gtk-launch foomởfoo.desktop

( gtk-launchtài liệu )

.Sdesktop phải ở trong / usr / share / application, / usr / local / share / application hoặc ~ / .local / share / application

Có thể sử dụng từ terminal hoặc alt + F2 (lệnh lưu trữ alt + F2 trong lịch sử để dễ dàng truy cập)


Đây là cách, làm việc trong debian quá.

gtk-launch firefox.desktop ~ / .local / share / application / launch firefox xem thư mục ~ / .local / share / application / cho tôi. Có vẻ như bạn đã đúng, firefox không nên được chuyển qua thư mục của tệp .desktop làm đối số. Trong thực tế, thư mục được chuyển đến gtk-launch không được sử dụng để định vị thư mục chứa tệp .desktop (và thực tế không phải vậy)
Croad Langshan

Yay! Một câu trả lời có tác dụng!
Alicia

Điều này cũng làm việc cho tôi trong Arch Linux. Không có câu trả lời nào khác thỏa đáng, nhưng câu trả lời này là tốt. :-) Nó hoạt động ngay cả khi tôi đang chạy KDE.
MountainX

2
Không có phiên bản này hoạt động với tôi trên Ubuntu 18.10. Mỗi lần nó phàn nàn ứng dụng không tồn tại, cho dù tôi có trong thư mục với tệp máy tính để bàn hay không, tôi có bao gồm phần mở rộng .desktop hay không và liệu tôi có đặt tên riêng cho thư mục đó hay không.
Joseph Garvin

38

Cho đến ngày hôm nay (12.10) , lỗi vẫn còn. Trong thực tế, nó phụ thuộc vào cách thức gvfs-open(được gọi bởi xdg-open) hoạt động.

Tuy nhiên, tôi đã quản lý một cách giải quyết nhanh chóng (đánh cắp cảm hứng từ mã nguồn nautilus). Nó hơi phức tạp, nhưng hoạt động hoàn hảo trên Ubuntu 12.10, thêm một biểu tượng có ý nghĩa (không còn nữa ?) trên trình khởi chạy Unity.

Đầu tiên, tôi đã viết một kịch bản python bằng Gio và được lưu nó dưới dạng ~/bin/run-desktop:

#!/usr/bin/python

from gi.repository import Gio
import sys 

def main(myname, desktop, *uris):
    launcher = Gio.DesktopAppInfo.new_from_filename(desktop)
    launcher.launch_uris(uris, None)

if __name__ == "__main__":
    main(*sys.argv)

Kịch bản cần phải có sự cho phép thực thi, vì vậy tôi đã chạy nó trong một thiết bị đầu cuối:

chmod +x ~/bin/run-desktop

Sau đó, tôi đã tạo .desktopmục tương đối trên ~/.local/share/applications/run-desktop.desktop:

[Desktop Entry]
Version=1.0
Name=run-desktop
Exec=run-desktop %U
MimeType=application/x-desktop
Terminal=false
Type=Application

Cuối cùng tôi liên quan đến sự xâm nhập như xử lý mặc định trong ~/.local/share/applications/mimeapps.listthuộc [Default Applications]phần như:

[Default Applications]
....
application/x-desktop=run-desktop.desktop

Hiện nay:

  • xdg-open Something.desktop hoạt động như mong đợi
  • #!/usr/bin/xdg-open hashbang trên đầu trang của một máy tính để bàn thực thi cũng hoạt động

Nó sẽ là công việc vô ích khi gvfs-opensẽ giải quyết lỗi, nhưng trong lúc này ...


1
Điều này hoạt động tốt hơn câu trả lời của Hamish Downer vì nó sẽ xử lý chính xác nhiều Exec=dòng và %tham số trong lệnh.
Flimm

4
Cảm ơn về mã - Tôi đang sử dụng Lucid và tôi chỉ lưu nó dưới dạng /usr/bin/xdg-openpyvà đưa nó chmod +x- và được sử dụng launcher.launch([],context)thay vì ...None,context)(vì " TypeError: đối số 1: Phải là chuỗi, không phải là Loại "). Bây giờ xdg-openpy app.desktophoạt động từ dòng lệnh (và tất cả như bình thường khi nhấp đúp app.desktop) và nó có thể nhắc nhở tôi nếu tôi cố gắng gọi trong thiết bị đầu cuối xdg-openvà nhấn tab. Chúc mừng!
sdaau

3
+1. Đây là câu trả lời duy nhất không yêu cầu phân tích cú pháp .desktoptệp theo cách thủ công , vì vậy đây là cách tiếp cận lành mạnh nhất (và an toàn). Cũng sử dụng hiện đại gi.repositorythay vì không dùng nữa pygtk, thật tuyệt! :)
MestreLion

2
Trên thực tế, đây là một câu hỏi liên quan đến câu trả lời của Carlo Pellegrini. Tôi là người mới, xin vui lòng sửa cho tôi nếu có cách tốt hơn để đặt nó. Kịch bản hoạt động thực sự tốt, nhưng biểu tượng tôi nhận được trên trình khởi chạy Unity không phải là biểu tượng được xác định trong tệp .desktop mà là biểu tượng mặc định của lệnh 'Exec'ed. Bất cứ ý tưởng về điều đó?
Ingo Leonhardt

1
@Noitidart viết câu trả lời cuối cùng dẫn mo làm một số google và tôi thấy vậy . Không kiểm tra được, nhưng có lẽ nó giúp được
Ingo Leonhardt

31

Đúng cách

Bạn nên thực sự sử dụng gtk-launchnếu nó có sẵn. Nó thường là một phần của gói libgtk-3-bin (điều này có thể thay đổi theo bản phân phối).

gtk-launch được sử dụng như sau:

gtk-launch APPLICATION [URI...]
gtk-launch app-name.desktop
gtk-launch app-name

Xin lưu ý rằng gtk-launchyêu cầu tệp .desktop phải được cài đặt (nghĩa là nằm trong /usr/share/applicationshoặc ~/.local/share/applications).

Vì vậy, để giải quyết vấn đề này, chúng ta có thể sử dụng một hàm Bashish nhỏ, tạm thời cài đặt tệp .desktop mong muốn trước khi khởi chạy nó. Cách "chính xác" để cài đặt tệp .desktop là thông qua desktop-file-installnhưng tôi sẽ bỏ qua điều đó.

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

    )

}

Bạn có thể sử dụng nó như vậy (và cũng chuyển qua các đối số hoặc URI bổ sung nếu bạn muốn):

launch PATH [URI...]
launch ./path/to/shortcut.desktop

Hướng dẫn thay thế

Nếu bạn muốn phân tích thủ công và thực thi tệp .desktop , bạn có thể làm như vậy với awklệnh sau :

awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system($0)}' app-name.desktop

Nếu bạn muốn coi awklệnh như một kịch bản tất cả trong một; chúng ta thậm chí có thể hiển thị thông báo lỗi và thoát với mã trả về là 1 trong trường hợp không tìm thấy lệnh Exec :

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}}'

Các lệnh đã nói ở trên sẽ:

  1. Tìm dòng bắt đầu bằng Exec =
  2. Xóa Exec =
  3. Hủy bỏ bất kỳ biến Exec (ví dụ %f, %u, %U). Có thể thay thế chúng bằng các đối số vị trí như thông số kỹ thuật dự định, nhưng làm như vậy sẽ làm tăng thêm độ phức tạp đáng kể cho vấn đề. Xem thông số kỹ thuật mới nhất của Desktop Desktop .
  4. Thực hiện lệnh
  5. Thoát ngay lập tức với mã thoát thích hợp (để không thực thi nhiều dòng Exec )

Lưu ý, tập lệnh AWK này giải quyết một vài trường hợp cạnh có thể được giải quyết đúng hoặc không bằng một số câu trả lời khác. Cụ thể, lệnh này sẽ loại bỏ nhiều biến Exec (chú ý không loại bỏ ký hiệu%), sẽ chỉ thực hiện một lệnh dòng Exec duy nhất và sẽ hoạt động như mong đợi ngay cả khi lệnh dòng Exec chứa một hoặc nhiều dấu bằng (ví dụ script.py --profile=name).

Chỉ cần một vài cảnh báo khác ... Theo thông số kỹ thuật, TryExec là:

Đường dẫn đến một tệp thực thi trên đĩa được sử dụng để xác định xem chương trình có thực sự được cài đặt hay không. Nếu đường dẫn không phải là đường dẫn tuyệt đối, tệp sẽ được tra cứu trong biến môi trường $ PATH. Nếu tập tin không có mặt hoặc nếu nó không được thực thi, mục nhập có thể bị bỏ qua (ví dụ không được sử dụng trong các menu).

Với ý nghĩ đó, sẽ không có ý nghĩa gì khi thực hiện giá trị của nó.

Một số mối quan tâm khác là PathTerminal . Đường dẫn bao gồm thư mục làm việc để chạy chương trình. Terminal là một boolean cho biết chương trình có chạy trong cửa sổ terminal không. Tất cả đều có thể được giải quyết, nhưng không có ý nghĩa gì trong việc phát minh lại bánh xe vì đã có triển khai thông số kỹ thuật. Nếu bạn muốn thực hiện Đường dẫn , hãy nhớ rằng system()sinh ra một quy trình con, vì vậy bạn không thể thay đổi thư mục làm việc bằng cách thực hiện một cái gì đó như system("cd \047" working_directory "\047"); system(command). Tuy nhiên, bạn có thể làm điều gì đó như thế system("cd \047" working_directory "\047 && " command). Lưu ý \ 047 là các dấu ngoặc đơn (vì vậy lệnh không ngắt trên các đường dẫn có dấu cách).

Thay thế Python

Tôi đang đánh cắp một trang từ Carlo ở đây , người đã đề xuất tạo một tập lệnh Python để sử dụng mô đun gi . Đây là một cách tối thiểu để thực thi cùng một mã từ trình bao mà không phải tạo tệp và lo lắng về I / O.

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

}

Sau đó thực hiện chức năng launcher như sau:

launch ./path/to/shortcut.desktop

Lưu ý việc sử dụng URI là tùy chọn. Ngoài ra, không có kiểm tra lỗi nào được thực hiện nên bạn sẽ muốn đảm bảo trình khởi chạy tồn tại và có thể đọc được (trước khi sử dụng nó) nếu bạn muốn tập lệnh của mình bền.


Nhưng awklệnh là tốt đẹp. Do đó, +1
AB

URI trong bối cảnh này là gì? Tôi có một tập tin máy tính để bàn trong một thư mục tùy ý. Làm thế quái nào tôi chỉ chạy gtk-launch trên nó mà không phải bọc nó trong một số tập lệnh khác? Điều này thật điên rồ.
Joseph Garvin

Đây awkgiải pháp sẽ không đúng cách có tác dụng nếu các lệnh có khoảng trắng đúp thoát hoặc backslashes. Nó phá vỡ điều này: Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnkdexgiải pháp hoạt động tốt.
MarSoft

27

Mặc dù OP không hỏi về KDE, nhưng đối với bất kỳ ai đang chạy KDE, có thể sử dụng lệnh sau:

kioclient exec <path-to-desktop-file>

Trên Fedora, điều này được bao gồm trong kde-runtimevòng / phút.


5
Nâng cao vì nó hoạt động. Không cần phải chạy KDE, miễn là bạn đã cài đặt chương trình này.
bản6

Có cách nào để có thiết bị xuất chuẩn này không? Tôi đã biên dịch trình phát clementine, có một lỗi chỉ xảy ra khi khởi chạy thông qua tệp .desktop (với plasma-shell). Và tôi không thể tìm ra, làm thế nào để có nhật ký đầu ra bất kỳ.
Kwaadpepper

@Kwaadpepper bạn có thể sử dụng tệp .desktop của mình để khởi chạy một tập lệnh shell, trong đó chạy nội bộ lệnh của bạn và chuyển hướng đầu ra thành một tệp.
Raman

Tôi không tìm thấy kioclient trong bất kỳ gói KDE nào cho Arch Linux tại thời điểm này. Tuy nhiên, gtk-launch hoạt động theo KDE đối với tôi.
MountainX

15

Bạn có thể sử dụng dex .

dex foo.desktop

2
IMHO đây chính xác là câu trả lời đúng: Một công cụ, một cuộc gọi duy nhất chỉ có tệp là tham số. Đó cũng là điều tôi đang tìm kiếm để kiểm tra .desktopcác tập tin viết tay . Và nó cũng có thể tạo .desktoptập tin, yay! :-)
Axel Beckert

Hoàn hảo! Nếu bạn thêm tệp .desktop sử dụng dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 vào / usr / share / application / bạn sẽ có thể khởi chạy các tệp máy tính để bàn trong trình quản lý tệp.
Stuart Axon

13
exo-open [[path-to-a-desktop-file]...]

dường như hoạt động trong phiên bản 13.10, nếu exo-utils được cài đặt (giống như trường hợp với Xubfox).


Có, chỉ cần thử nghiệm nó trong Ubuntu Studio 14.04. BTW. xdg-open và gvfs-open công việc ở đó, quá.
jarno

Hoạt động trong 15 là tốt
Jonathan

Sử dụng Debian với xfce. Hoạt động tuyệt vời!
king_julien

Hoạt động với tôi trong Ubuntu 14.04
Tyler Collier

8

Phụ lục cho câu trả lời của Hamish.

Đưa ra tập lệnh Deskopen, bạn có thể sử dụng tham chiếu đến nó dưới dạng dòng shebang trong tệp .desktop , vì ký tự nhận xét vẫn còn #. Điều đó có nghĩa là, đặt đây là dòng đầu tiên của tệp .desktop :

#!/usr/bin/env deskopen

Sau đó gắn cờ tệp .desktop là tệp thực thi (ví dụ: với a chmod +x whatever.desktop), và sau đó bạn có thể

path/to/whatever.desktop

voilà - Ứng dụng sẽ mở! (Hoàn thành với tệp biểu tượng tôi đã chỉ định, mặc dù tôi không biết làm thế nào.)

Bây giờ, nếu bạn cũng muốn Deskopen chuyển qua bất kỳ tham số dòng lệnh nào, thay vào đó bạn có thể sử dụng phiên bản sửa đổi một chút này:

#!/bin/sh
desktop_file=$1
shift
`grep '^Exec' "${desktop_file}" | sed 's/^Exec=//' | sed 's/%.//'` "$@" &

Ở một bên, tôi đã thử sử dụng "#{@:2}"thay vì shifting, nhưng nó cứ cho tôi 'sự thay thế tồi tệ' ...


Tôi biết đây là một nhận xét phù hợp hơn với câu trả lời của Hamish, nhưng tôi là người dùng mới và không được phép bình luận. Ồ tốt
pabst

Nếu bạn có danh tiếng, thực sự hành động thích hợp nhất là chỉnh sửa câu trả lời đó.
Flimm

Hãy nói rằng, bất cứ ai cũng có thể đề xuất các chỉnh sửa, ngay cả những người dùng chưa đăng nhập! Không có vấn đề gì cả.
Flimm

1
Đây là một câu trả lời của chính nó, tốt của nó.
Bruno Pereira

bạn có thể sử dụng "${@:1}"thay vì shift, nhưng điều đó đòi hỏi bashthay vì shtrong #!shebang của bạn . IMHO cách tiếp cận thay đổi ban đầu của bạn đơn giản và tốt hơn
MestreLion

6

Hiện tại không có một ứng dụng nào thực hiện những gì bạn mô tả trong kho lưu trữ Ubuntu. Có một vài nỗ lực trong tiến trình tạo ra một giải pháp chung để cung cấp tích hợp cho các môi trường máy tính để bàn (như openbox) không tuân thủ các thông số XDG này.

Arch Linux đang nghiên cứu triển khai xdg-autostart dựa trên các thư viện python-xdg. Từ những gì tôi có thể tìm thấy, điều này dường như chưa hoàn toàn đầy đủ, nhưng có một số báo cáo về sự thành công.

Ngoài ra còn có một triển khai C ++ của xdg-autostart trên gitorious (http://gitorious.org/xdg-autostart/) có thể sẽ được hưởng lợi từ việc sử dụng rộng rãi hơn.

Nếu một trong hai giải pháp phù hợp với bạn, vui lòng xem xét việc gửi công việc cần thiết để đưa vào Debian hoặc Ubuntu.

Để sử dụng một trong hai công cụ với openstart, bạn sẽ gọi nó trong /etc/xdg/openbox/autostart.sh (nếu tôi đang đọc chính xác tài liệu về hộp mở). Nếu điều này không hoạt động, có lẽ bạn có thể gọi nó trong bất kỳ tập lệnh khởi tạo phiên mở nào.


Không phải những gì tôi sẽ nghe, dù sao cũng cảm ơn vì thông tin
enzotib

6

Tôi không có giải pháp ngay lập tức đáp ứng yêu cầu "sử dụng lệnh tiêu chuẩn" , nhưng nếu bạn muốn phân tích tối thiểu các .desktoptệp hoặc muốn tạo bí danh Bash, thì cách sau sẽ hoạt động:

  • awk -F= '/Exec=/{system($2); exit}' foo.desktop

một cách tiếp cận khác có thể thú vị, sẽ là tạo một binfmt-miscphương thức cấp kernel hơn so với .desktopcác tệp phù hợp (xem grep -r . /proc/sys/fs/binfmt_misc/các mẫu mà bạn hiện đã bật).

Vào cuối ngày, một cái gì đó ở đâu đó sẽ phải phân tích các .desktoptệp, đó chỉ là một câu hỏi về "tiêu chuẩn / mặc định" đó là như thế nào.


Cảm ơn bạn, thú vị. Là "tiêu chuẩn" Tôi có nghĩa là một cái gì đó được cung cấp bởi DE và tuân thủ freedesktop.org.
enzotib

Upvote cho awkchứ không phải là một chuỗi greps và seds.
jmtd

Upvote, mặc dù nó không hoạt động (hoặc tốt hơn là đặt - hoạt động quá nhiều) nếu bạn có Exec=các dòng siêu cấp : /
Boris Churzin

2

Tôi lấy kịch bản từ câu trả lời của Carlo ở trên và cố gắng cải thiện nó để sử dụng máy tính để bàn của riêng tôi.

Phiên bản tập lệnh này sẽ cho phép bạn chạy bất kỳ ứng dụng nào như thể bạn đã nhập nó trên HUD, miễn là đó có thể là kết quả đầu tiên. Nó cũng cho phép bạn truyền các đối số tệp cho các tệp .desktop không hỗ trợ URI.

#!/usr/bin/env python

from gi.repository import Gio
from argparse import ArgumentParser
import sys, os

def find_app(search_string):
    for group in Gio.DesktopAppInfo.search(search_string):
        for entry in group:
            try:
                return Gio.DesktopAppInfo.new(entry)
            except: pass
    return None

def main(args):
    launcher = None
    if os.path.isfile(args.appName):
        try:
        # If it's a file, do that first.
            launcher = Gio.DesktopAppInfo.new_from_filename(args.appName)
        except TypeError:
            print "'" + args.appName + "' is not a .desktop file"
            sys.exit(-1)
    # If it's a .desktop file in the DB, try using that
    if launcher is None and args.appName.endswith('.desktop'):
        try:
            launcher = Gio.DesktopAppInfo.new(args.appName)
        except TypeError: pass

    if launcher is None:
        # Search for the app by the text given
        launcher = find_app(args.appName)

    if launcher is None:
        print "No app named " + args.appName + " could be found"
        sys.exit(-1)
    if (launcher.supports_uris()):
        launcher.launch_uris(args.uris, None)
    elif (launcher.supports_files()):
        launcher.launch(list({ Gio.File.parse_name(x) for x in args.uris }), None)
    else :
        launcher.launch()

if __name__ == "__main__":
    argParser = ArgumentParser(description="Launch a .desktop file or application")
    argParser.add_argument("appName", 
        help="the name of any application, a desktop file's basename, or a concrete path to a desktop file", 
        action='store'
    )
    argParser.add_argument("uris", 
        nargs='*', 
        help="Files or URIs to pass to the application"
    )
    args = argParser.parse_args()
    main(args)

1

Khi thử kiểm tra các tệp này, tôi thấy cách đơn giản nhất để kiểm tra xem DM hoặc trình quản lý phiên sẽ làm những gì tôi mong đợi là mở thư mục xung quanh trong trình duyệt thư mục UI và sau đó nhấp đúp để mở chúng.

Nếu bạn đang ở trong một dòng lệnh: gvfs-open .hoặc gnome-open .sẽ mở nó trong trình duyệt thư mục được cấu hình.

Điều quyến rũ sẽ không phản ánh hành vi của DM, bao gồm những thứ lặt vặt như trốn thoát và trích dẫn nơi bạn thực sự không muốn hành vi thay thế. Đó không phải là dòng lệnh, nhưng nó đã xác nhận mọi thứ. Tôi cũng tìm thấy thiết lập Terminal=truehữu ích cho gỡ lỗi.


Thiết bị đầu cuối biến mất ngay lập tức, tôi không có thời gian để xem tin nhắn khi sử dụng Terminal = true: s
gouessej

1

Đây câu trả lời SO là những gì làm cho nó rõ ràng cho tôi: không nên cố gắng để thực hiện các tập tin máy tính để bàn, thực hiện các tập tin chỉ vào trong file máy tính để bàn.

Ví dụ: thực thi /home/jsmith/Desktop/x11vnc.sh

Exec=/home/jsmith/Desktop/x11vnc.sh

1

(Tổng hợp từ nhiều câu trả lời khác ở đây)

Tùy thuộc vào hệ thống của bạn và các lỗi khác nhau có thể tồn tại hoặc không tồn tại trên hệ thống của bạn, hãy thử các cách sau cho đến khi một trong số chúng hoạt động:

  1. xdg-open program_name.desktop
  2. exo-open program_name.desktop
  3. gtk-launch program_name.desktop
  4. kioclient exec program_name.desktop
  5. dex program_name.desktop

Lưu ý rằng trên các hệ thống Ubuntu, trình khởi chạy máy tính để bàn "menu bắt đầu" của bạn có sẵn trong /usr/share/applications/.

Ví dụ, để hiển thị các lệnh trên thực hiện hoặc không hoạt động trên hệ thống Ubuntu 14.04 của tôi, đây là kết quả của các cuộc gọi sau đây cho tôi:

  1. xdg-open /usr/share/applications/eclipse_for_cpp.desktop # Lỗi do lỗi (cố gắng để tôi lưu tệp .desktop này)
  2. exo-open /usr/share/applications/eclipse_for_cpp.desktop # Làm
  3. gtk-launch /usr/share/applications/eclipse_for_cpp.desktop # Thất bại với "gtk-launch: không có ứng dụng như vậy"
  4. kioclient exec /usr/share/applications/eclipse_for_cpp.desktop # Làm
  5. dex /usr/share/applications/eclipse_for_cpp.desktop# Thất bại, và sudo apt install dexkhông thể xác định vị trí gói dex

0

Hãy chắc chắn rằng tập lệnh máy tính để bàn của bạn trỏ đến cũng có thể thực thi được.

Nếu vẫn không hoạt động. Làm cho tập tin máy tính để bàn có thể chạy được trong thiết bị đầu cuối bằng cách thay đổi Terminal=truevà đặt nó trong tập lệnh bash. Chạy script để bắt lỗi đầu ra. Thay đổi lại khi lỗi được sửa.


0

Câu trả lời của Hamish là tuyệt vời, nhưng tôi muốn đề xuất một giải pháp thay thế đơn giản hơn, với ít đường ống hơn:

$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)

Trong trường hợp này, awktìm kiếm dòng bắt đầu bằng Exec, và sau đó chúng tôi chỉ cần in các trường sau dòng đó, sử dụng vòng lặp và =chúng tôi in trường 2, tức là, bất cứ điều gì đến sau trường đó. Dấu ngoặc nhọn ở hai đầu của các lệnh $(...), là sự thay thế tham số, do đó shell sẽ thực thi bất cứ lệnh nào awk trả về; trong trường hợp này, nó trả về lệnh thực tế đi sau Exec=.

Trong một số trường hợp hiếm hoi có thể có nhiều hơn một =dấu hiệu, đó vẫn là một khả năng. Đối với điều đó, tôi đề nghị

$(awk -F= '/^Exec/||/^TryExec/ {for(i=2;i<=NF;i++) print $i;exit}' /usr/share/applications/firefox.desktop)

Nice, awkvà Serg =)
AB

Và đôi khi, có một TryExec, có lẽ bạn nên kiểm tra lệnh thứ 2 của mình =)
AB

@AB Hehe, awklà vũ khí lựa chọn của tôi khi nói đến xử lý văn bản. Bên cạnh đó, cú pháp của nó gần với C. Ồ, và đã thêm TryExecmột phần ^ _ ^
Sergiy Kolodyazhnyy

Bạn có +1 =)
AB

Nhưng những gì về %f, %u, %Uhoặc một cái gì đó như thế này sau lệnh?
AB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.