เรียกใช้ไฟล์ .desktop ในเทอร์มินัล


141

จากสิ่งที่ฉันรวบรวมได้.desktopไฟล์คือทางลัดที่อนุญาตให้ปรับแต่งการตั้งค่าแอปพลิเคชัน ตัวอย่างเช่นฉันมีพวกเขามากมายใน/usr/share/applications/โฟลเดอร์ของฉัน

หากฉันเปิดโฟลเดอร์nautilusนั้นฉันสามารถเรียกใช้แอปพลิเคชันเหล่านี้เพียงแค่ดับเบิลคลิกที่ไฟล์ที่เกี่ยวข้องเช่นดับเบิลคลิกfirefox.desktopเรียกใช้ Firefox อย่างไรก็ตามฉันไม่สามารถหาวิธีที่จะทำสิ่งเดียวกันผ่านทางสถานี

ถ้าฉันทำgnome-open foo.desktopมันก็แค่เปิดfoo.desktopเป็นไฟล์ข้อความ ถ้าฉันทำให้มันสามารถเรียกใช้งานได้และเรียกใช้ในการทุบตีมันก็ล้มเหลว (ซึ่งคาดว่าจะชัดเจนไม่ใช่สคริปต์ทุบตี)
แก้ไข: การexec /fullpath/foo.desktopให้Permission deniedข้อความถึงฉันแม้ว่าฉันจะเปลี่ยนความเป็นเจ้าของเป็นของตัวเองก็ตาม หากฉันทำให้สามารถเรียกใช้งานได้และทำตามคำสั่งเดียวกันแท็บเทอร์มินัลที่ฉันกำลังใช้ก็จะปิดลง (ฉันเดาว่ามันจะขัดข้อง) สุดท้ายถ้าผมทำผมได้รับรายงานข้อผิดพลาดsudo exec /fullpath/foo.desktopsudo: exec: command not found

นั่นคือคำถามของฉันฉันจะเรียกใช้foo.desktopไฟล์จากเทอร์มินัลได้อย่างไร


5
หมายเหตุ: เหตุผลที่คุณexecล้มเหลวเนื่องจาก exec แทนที่กระบวนการที่คุณกำลังดำเนินการอยู่ในปัจจุบันด้วยกระบวนการที่คุณระบุดังนั้นสิ่งที่คุณทำคือพยายามแทนที่เชลล์ของคุณด้วยการรันเดสก์ท็อปเป็นไบนารีที่รวบรวม เหตุผลที่คุณทำไม่ได้sudo execเพราะมันเป็นเชลล์ที่มีอยู่แล้วไม่ใช่คำสั่งไบนารี
Daenyth

น่าสนใจฉันสงสัยว่าทำไมมันทำให้แท็บปิด
Malabarba

ที่เกี่ยวข้อง: Hashbang สำหรับไฟล์ Gnome .desktop
ændrük

ฉันเห็นพวกเขาสิ้นสุดการแยกวิเคราะห์ไฟล์ .desktop ขอบคุณสำหรับลิงค์
enzotib

ผู้ดำเนินรายการ: โอ๊ะโอฉันคิดว่าฉันอาจตั้งค่าสถานะนี้โดยไม่ได้ตั้งใจขออภัยหากเป็นกรณีนี้
Croad Langshan

คำตอบ:


54

คำสั่งที่เรียกใช้มีอยู่ในไฟล์เดสก์ท็อปนำหน้าด้วยExec=ดังนั้นคุณสามารถแตกและรันได้โดย:

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

ที่จะพังทลายลง

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

คุณสามารถใส่มันลงในไฟล์พูด~/bin/deskopenกับเนื้อหา

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

จากนั้นทำให้ปฏิบัติการได้

chmod +x ~/bin/deskopen

จากนั้นคุณสามารถทำได้เช่น

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

อาร์กิวเมนต์ ( %uและ%Fอื่น ๆ ) มีรายละเอียดที่http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables - ไม่มีข้อใดที่เกี่ยวข้องสำหรับการเรียกใช้ที่บรรทัดคำสั่ง .


สิ่งนี้ให้ผลลัพธ์ที่ดีที่สุดจนถึงตอนนี้ แต่บางครั้งก็สร้างพฤติกรรมที่ไม่พึงประสงค์ มันเกิดขึ้นเมื่อใดก็ตามที่บรรทัด "Exec =" มีอาร์กิวเมนต์เช่น% u หรือ% i Bash พยายามส่งผ่านสตริงนั้นเป็นอาร์กิวเมนต์ปกติ ยกตัวอย่างเช่นการทำgrep '^Exec' firefox.desktop | sed 's/^Exec=//'เปิด Firefox กับแท็บที่โหลดwww.% u.com
Malabarba

ในขณะที่ฉันได้เพิ่มวินาทีsedเพื่อลบข้อโต้แย้งใด ๆ แต่ฉันคิดว่าอาจมีวิธี "ธรรมชาติ" มากกว่าในการเรียกใช้
Malabarba

ฉันได้อัปเดตคำตอบของฉันด้วยคำสั่งพิเศษ - ฉันลืมไฟล์เดสก์ท็อปอาจมีข้อโต้แย้ง
Hamish Downer

คุณควรเพิ่ม "หาง -1" ลงในไพพ์หลังจาก "grep" เนื่องจาก "Exec =" สามารถปรากฏได้หลายครั้งและหลังจากนั้นเฉพาะการปรากฏตัวครั้งสุดท้ายเท่านั้นที่ควรดำเนินการ ..
เดซี่

13
-1: สิ่งนี้อาจใช้งานได้กับ.desktopไฟล์อย่างง่ายแต่จะไม่สนใจรายการที่ต้องการPath=และTryExec=อาจส่งผลต่อการดำเนินการ นอกจากนี้ยังเรียกใช้งานผิดExec=ถ้าไฟล์มีการทำงานของเดสก์ท็อป ("รายการ
ด่วน

85

คำตอบที่ควรจะเป็น

xdg-open program_name.desktop

แต่เนื่องจากข้อผิดพลาดนี้ไม่ทำงานอีกต่อไป


7
ว้าวนี่ยังคงเป็นบั๊กความคืบหน้ามากมายใน xdg exo-openถูกแสดงรายการเป็นวิธีแก้ปัญหาและจะเปิด gedit ด้วย :(
ดึง

1
@RichardHolloway: gnome-openไม่ได้เรียกxdg-openมันเป็นวิธีอื่น ๆ ! ดังนั้นปัญหาอยู่ในgvfs-open(ผู้สืบทอดหรือgnome-open)
MestreLion

13
"ไม่ทำงานอีกต่อไป"? มันไม่เคยทำ! xdg-openทำงานโดยการเชื่อมโยง mimetype และ.desktopไฟล์เกี่ยวข้องกับเครื่องมือแก้ไขข้อความเนื่องจากเป็นคลาสย่อยของข้อความ
MestreLion

13
นี้คือโง่ (ว่าไม่มีวิธีที่เหมาะสมในการเรียกใช้ไฟล์สก์ท็อปจากท่าเรือ)
แซมวัตคินส์

2
เหมาะกับฉันบน Arch Linux แต่อาจเป็นข้อผิดพลาดเฉพาะ Ubuntu
Victor

75

ด้วย Ubuntu ล่าสุดที่รองรับgtk-launchเพียงแค่ไป

gtk-launch <file>โดยที่เป็นชื่อของไฟล์ .desktop ที่มีหรือไม่มี.desktopส่วน

ดังนั้นgtk-launch fooเปิดfoo.desktop

( gtk-launchเอกสาร )

.desktop ควรอยู่ใน / usr / share / applications, / usr / local / share / applications หรือ ~ / .local / share / applications

ใช้งานได้จากเทอร์มินัลหรือ alt + F2 (alt + F2 เก็บคำสั่งในประวัติการเข้าถึงได้ง่าย)


นี่คือวิธีทำงานในเดเบียนด้วย

gtk-launch firefox.desktop ~ / .local / share / applications / เปิดตัว firefox เพื่อดูไดเรกทอรี ~ / .local / share / applications /สำหรับฉัน ดูเหมือนว่าคุณถูกต้อง firefox ไม่ควรผ่านไดเรกทอรีของไฟล์ .desktop เป็นอาร์กิวเมนต์ ในความเป็นจริงไดเรกทอรีที่ส่งผ่านไปยัง gtk-launch ไม่ควรถูกใช้เพื่อค้นหา dir ที่มีไฟล์. esktop (และไม่ใช่ในความเป็นจริง)
Croad Langshan

เย้! คำตอบที่ได้ผล!
Alicia

สิ่งนี้ใช้ได้กับฉันใน Arch Linux ด้วย ไม่มีคำตอบอื่นใดที่น่าพอใจ แต่อันนี้ดี :-) มันใช้งานได้แม้ว่าฉันจะใช้ KDE
MountainX

2
ไม่มีเวอร์ชันนี้สำหรับฉันใน Ubuntu 18.10 ทุกครั้งที่บ่นว่าแอปพลิเคชันไม่มีอยู่ไม่ว่าฉันจะอยู่ในโฟลเดอร์ที่มีไฟล์เดสก์ท็อปหรือไม่ก็ตามไม่ว่าฉันจะรวมส่วนขยาย .desktop หรือไม่ก็ตามและฉันแยกชื่อไดเรกทอรีหรือไม่
โจเซฟการ์วิน

38

ณ วันนี้ (12.10) ข้อผิดพลาดยังคงมีอยู่ มันเป็นความจริงขึ้นอยู่กับการทำงานของgvfs-open(เรียกโดยxdg-open)

ถึงกระนั้นฉันจัดการวิธีแก้ปัญหาอย่างรวดเร็ว (ขโมยแรงบันดาลใจจากซอร์สโค้ด nautilus) มันซับซ้อนเล็กน้อย แต่ทำงานได้อย่างไม่มีที่ติบน Ubuntu 12.10 เพิ่มไอคอนที่มีความหมาย (ไม่มาก?) บน Unity launcher

ก่อนอื่นฉันเขียนสคริปต์ไพ ธ อนโดยใช้ Gio และบันทึกไว้เป็น~/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)

สคริปต์จำเป็นต้องได้รับอนุญาตจากการประมวลผลดังนั้นฉันจึงรันสิ่งนี้ในเทอร์มินัล:

chmod +x ~/bin/run-desktop

จากนั้นฉันสร้าง.desktopรายการที่เกี่ยวข้องใน~/.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

ในที่สุดฉันก็เชื่อมโยงรายการเป็นตัวจัดการเริ่มต้นใน~/.local/share/applications/mimeapps.listภายใต้[Default Applications]ส่วนที่:

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

ขณะนี้:

  • xdg-open something.desktop ทำงานตามที่คาดไว้
  • #!/usr/bin/xdg-open hashbang ด้านบนของรายการเดสก์ท็อปที่ปฏิบัติการได้ก็ทำงานได้เช่นกัน

มันจะไร้ประโยชน์เมื่อgvfs-openจะแก้ไขข้อผิดพลาด แต่ในระหว่างนี้ ...


1
สิ่งนี้ทำงานได้ดีกว่าคำตอบของ Hamish Downerเนื่องจากมันจะจัดการกับหลายExec=บรรทัดและ%พารามิเตอร์ในคำสั่งอย่างถูกต้อง
Flimm

4
ขอบคุณสำหรับรหัส - ฉันอยู่ใน Lucid และฉันก็บันทึกสิ่งนี้เป็น/usr/bin/xdg-openpyและมอบchmod +x- และใช้launcher.launch([],context)แทน...None,context)(เพราะ " TypeError: อาร์กิวเมนต์ 1: ต้องเป็นลำดับไม่ใช่ NoneType ") ตอนนี้xdg-openpy app.desktopทำงานจากบรรทัดคำสั่ง (และทั้งหมดเป็นปกติเมื่อดับเบิลคลิกapp.desktop) และมันสามารถเตือนฉันถ้าฉันพยายามโทรใน terminal xdg-openและกดแท็บ ไชโย!
sdaau

3
+1 นี่เป็นคำตอบเดียวที่ไม่ต้องการแยกวิเคราะห์.desktopไฟล์ด้วยตนเองดังนั้นจึงเป็นวิธีที่มีเหตุผลมากที่สุด (และปลอดภัย) ยังใช้ความทันสมัยgi.repositoryแทนการคัดค้านpygtkดีมาก! :)
MestreLion

2
อันที่จริงนี่เป็นคำถามเกี่ยวกับคำตอบของ Carlo Pellegrini ฉันเป็นมือใหม่โปรดแก้ไขให้ฉันด้วยถ้ามีวิธีที่ดีกว่าที่จะวางไว้ สคริปต์ทำงานได้ดีจริงๆ แต่ไอคอนที่ฉันได้รับบน Unity launcher ไม่ใช่ไอคอนที่กำหนดไว้ในไฟล์. desktop แต่เป็นไอคอนเริ่มต้นของคำสั่ง 'Exec'ed มีความคิดเห็นเกี่ยวกับอะไร
Ingo Leonhardt

1
@Noitidart เขียนคำตอบสุดท้ายที่นำมิสซูรี่ที่จะทำบางอย่างของ Google และฉันพบว่า ยังไม่ได้ตรวจสอบ แต่อาจช่วยได้
Ingo Leonhardt

31

ทางที่ถูก

คุณควรใช้งานจริง ๆgtk-launchถ้ามี มันมักจะเป็นส่วนหนึ่งของแพคเกจlibgtk-3-bin (ซึ่งอาจแตกต่างกันไปตาม distro)

gtk-launch ใช้ดังนี้:

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

โปรดทราบว่าgtk-launchจำเป็นต้องติดตั้งไฟล์ . desktop (เช่นอยู่ใน/usr/share/applicationsหรือ~/.local/share/applications)

ดังนั้นเพื่อให้ได้สิ่งนี้เราสามารถใช้ฟังก์ชั่น Bash ตัวเล็ก ๆ ของแฮ็กที่จะทำการติดตั้งไฟล์ . desktopที่ต้องการเป็นการชั่วคราวก่อนที่จะเปิดตัวมัน วิธี "ติดตั้ง" ที่ถูกต้องในการติดตั้งไฟล์. เดสก์ท็อปคือผ่านdesktop-file-installแต่ฉันจะไม่สนใจสิ่งนั้น

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

    )

}

คุณสามารถใช้มันได้เช่นกัน (และส่งต่ออาร์กิวเมนต์หรือ URIs เพิ่มเติมหากคุณต้องการ):

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

ทางเลือกด้วยตนเอง

หากคุณต้องการแยกวิเคราะห์และเรียกใช้ไฟล์ . desktopด้วยตนเองคุณสามารถทำได้ด้วยawkคำสั่งต่อไปนี้:

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

หากคุณต้องการใช้awkคำสั่งเหมือนสคริปต์แบบ all-in-one เราสามารถแสดงข้อความแสดงข้อผิดพลาดและออกด้วยรหัสส่งคืน 1 ในกรณีที่ไม่พบคำสั่ง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}}'

คำสั่งดังกล่าวจะ:

  1. ค้นหาบรรทัดที่ขึ้นต้นด้วยExec =
  2. ลบExec =
  3. นำตัวแปร Exec ใด ๆ (เช่น%f, %u, %U) เป็นไปได้ที่จะแทนที่สิ่งเหล่านี้ด้วยอาร์กิวเมนต์ตำแหน่งในขณะที่สเปคตั้งใจ แต่การทำเช่นนั้นจะเพิ่มความซับซ้อนที่สำคัญให้กับปัญหา ดูล่าสุดจำเพาะ Entry สก์ท็อป
  4. ดำเนินการคำสั่ง
  5. ออกทันทีด้วยรหัสออกที่เหมาะสม (เพื่อไม่ให้ทำงานExecหลายสาย)

หมายเหตุสคริปต์ AWK นี้ระบุกรณีขอบบางกรณีที่อาจตอบสนองหรือไม่ตอบคำถามอื่น ๆ ได้อย่างเหมาะสม โดยเฉพาะคำสั่งนี้จะลบตัวแปรExecหลายตัว (ระวังไม่ให้ลบสัญลักษณ์%) ออกไป, จะดำเนินการคำสั่งExecบรรทัดเดียวเท่านั้น, และจะทำงานตามที่คาดไว้แม้ว่าคำสั่งExec line จะมีเครื่องหมายเท่ากับหนึ่งเครื่องหมายขึ้นไป (เช่นscript.py --profile=name)

เพียงไม่กี่ประการอื่น ... ตามข้อกำหนดTryExecคือ:

พา ธ ไปยังไฟล์ที่เรียกใช้งานได้บนดิสก์ที่ใช้เพื่อตรวจสอบว่ามีการติดตั้งโปรแกรมจริงหรือไม่ หากพา ธ ไม่ใช่พา ธ สัมบูรณ์ไฟล์จะค้นหาในตัวแปรสภาพแวดล้อม $ PATH หากไฟล์นั้นไม่มีอยู่หรือไม่สามารถเรียกใช้งานได้รายการนั้นอาจถูกละเว้น (ไม่ได้ใช้ในเมนูตัวอย่าง)

โดยที่ในใจมันไม่สมเหตุสมผลเลยที่จะเรียกใช้คุณค่าของมัน

บางคนกังวลอื่น ๆ ที่มีเส้นทางและเทอร์มิ พา ธประกอบด้วยไดเรกทอรีทำงานเพื่อเรียกใช้โปรแกรมเทอร์มินัลคือบูลีนที่ระบุว่าโปรแกรมนั้นทำงานในหน้าต่างเทอร์มินัลหรือไม่ สิ่งเหล่านี้สามารถแก้ไขได้ แต่ไม่มีเหตุผลในการปรับแต่งวงล้อใหม่เนื่องจากมีการติดตั้งสเป็คแล้ว หากคุณต้องการนำPathไปใช้โปรดจำไว้ว่าsystem()วางกระบวนการย่อยไว้ดังนั้นคุณไม่สามารถเปลี่ยนไดเร็กตอรี่ที่ใช้งานsystem("cd \047" working_directory "\047"); system(command)ได้ system("cd \047" working_directory "\047 && " command)แต่คุณคงจะสามารถทำสิ่งที่ชอบ หมายเหตุ \ 047 เป็นเครื่องหมายคำพูดเดี่ยว (ดังนั้นคำสั่งจะไม่หยุดพักบนเส้นทางที่มีช่องว่าง)

ทางเลือกหลาม

ฉันขโมยหน้าเว็บจาก Carlo ที่นี่ผู้แนะนำให้สร้างสคริปต์ Python เพื่อใช้โมดูลgi นี่เป็นวิธีที่น้อยที่สุดในการรันโค้ดเดียวกันจากเชลล์โดยไม่ต้องสร้างไฟล์และกังวลเกี่ยวกับ 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

}

จากนั้นเรียกใช้งานฟังก์ชันตัวเรียกใช้งานดังต่อไปนี้:

launch ./path/to/shortcut.desktop

โปรดทราบว่าการใช้ URIs นั้นเป็นทางเลือก นอกจากนี้ยังไม่มีการตรวจสอบข้อผิดพลาดดังนั้นคุณจึงต้องการมั่นใจว่าตัวเรียกใช้งานนั้นมีอยู่และสามารถอ่านได้ (ก่อนใช้งาน) หากคุณต้องการให้สคริปต์ของคุณทนทาน


แต่awkคำสั่งนั้นดี ดังนั้น +1
AB

URI คืออะไรในบริบทนี้ ฉันมีไฟล์เดสก์ท็อปในโฟลเดอร์โดยพลการ ฉันจะเรียกใช้ gtk-launch บน heck ได้อย่างไรโดยไม่ต้องใส่ในสคริปต์อื่น นี่มันบ้าคลั่ง
โจเซฟการ์วิน

awkวิธีนี้จะทำงานไม่ถูกต้องหากคำสั่งมีช่องว่างหรือช่องว่างด้านหลังสองครั้ง มันหยุดลงที่นี่: Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnkและdexวิธีการแก้ปัญหาทำงานได้ดี
MarSoft

27

ในขณะที่ OP ไม่ได้ถามเกี่ยวกับ KDE สำหรับทุกคนที่ใช้ KDE คำสั่งต่อไปนี้สามารถใช้ได้:

kioclient exec <path-to-desktop-file>

ใน Fedora สิ่งนี้รวมอยู่ในkde-runtimeรอบต่อนาที


5
โหวตขึ้นเพราะใช้งานได้ ไม่จำเป็นต้องเรียกใช้ KDE เลยตราบใดที่คุณติดตั้งโปรแกรมนี้
basic6 6

มีวิธีที่จะมี stdout นี้หรือไม่? ฉันได้รวบรวมโปรแกรมเล่นแบบผ่อนปรนซึ่งมีข้อผิดพลาดที่เกิดขึ้นเฉพาะการเปิดตัวผ่านไฟล์ .desktop (พร้อม plasma-shell) และฉันไม่สามารถคิดออกได้ว่าจะมีบันทึกบันทึกผลลัพธ์อย่างไร
Kwaadpepper

@Kwaadpepper คุณสามารถใช้ไฟล์ .desktop ของคุณเพื่อเปิดเชลล์สคริปต์ซึ่งจะรันคำสั่งของคุณภายในและเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์
รามัน

ฉันไม่พบ kioclient ในแพ็คเกจของ KDE สำหรับ Arch Linux ในขณะนี้ อย่างไรก็ตาม gtk-launch นั้นทำงานภายใต้ KDE สำหรับฉัน
MountainX

15

คุณสามารถใช้Dex

dex foo.desktop

2
IMHO นี่คือคำตอบที่ถูกต้อง: เครื่องมือหนึ่งการเรียกครั้งเดียวที่มีไฟล์เป็นพารามิเตอร์ นั่นคือสิ่งที่ฉันกำลังมองหาเพื่อทดสอบ.desktopไฟล์ที่เขียนด้วยมือ และมันสามารถสร้าง.desktopไฟล์ได้ด้วย! :-)
Axel Beckert

ที่สมบูรณ์แบบ! หากคุณเพิ่มไฟล์. desktop ที่ใช้ dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 ไปยัง / usr / share / applications / คุณจะสามารถเปิดไฟล์เดสก์ท็อปในตัวจัดการไฟล์โดยไม่ต้องเปิดใน gedit โดยค่าเริ่มต้น
Stuart Axon

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

ดูเหมือนว่าจะทำงานในรุ่น 13.10 ถ้ามีการติดตั้ง exo-utils (เช่นกรณีที่มี Xubuntu)


ใช่เพิ่งทดสอบใน Ubuntu Studio 14.04 BTW xdg-open และ gvfs-open ทำงานที่นั่นเช่นกัน
jarno

ทำงานใน 15 เช่นกัน
Jonathan

ใช้ Debian ด้วย xfce ใช้งานได้ดี!
king_julien

ใช้งานได้สำหรับฉันใน Ubuntu 14.04
Tyler Collier

8

ภาคผนวกของคำตอบของ Hamish

รับสคริปต์ deskopen คุณสามารถใช้การอ้างอิงถึงมันเป็นบรรทัด shebang ในไฟล์. desktopเนื่องจากตัวอักษรความคิดเห็นยังคง#อยู่ กล่าวคือให้วางสิ่งนี้เป็นบรรทัดแรกของไฟล์ . desktop :

#!/usr/bin/env deskopen

จากนั้นตั้งค่าสถานะไฟล์ . desktopว่าสามารถเรียกใช้งานได้ (เช่นด้วย a chmod +x whatever.desktop) จากนั้นคุณสามารถ

path/to/whatever.desktop

และvoilà - แอพจะเปิดขึ้น! (กรอกด้วยไฟล์ไอคอนที่ฉันระบุ แต่ฉันไม่รู้ว่าจะทำอย่างไร)

ตอนนี้ถ้าคุณต้องการให้ deskopen ส่งผ่านพารามิเตอร์บรรทัดคำสั่งคุณสามารถใช้เวอร์ชันที่แก้ไขเล็กน้อยนี้แทน:

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

นอกเหนือจากนี้ฉันพยายามใช้"#{@:2}"แทนการส่งshiftไอเอ็นจี แต่มันทำให้ฉันมี 'การทดแทนที่ไม่ดี' ...


ฉันรู้ว่านี่เป็นความคิดเห็นที่เหมาะสมกับคำตอบของ Hamish มากกว่า แต่ฉันเป็นผู้ใช้ใหม่และไม่ได้รับอนุญาตให้แสดงความคิดเห็น โอ้ดี!
pabst

หากคุณมีชื่อเสียงการกระทำที่เหมาะสมที่สุดคือการแก้ไขคำตอบนั้นจริง ๆ แล้ว
Flimm

ประท้วงว่าใครก็ตามสามารถแนะนำการแก้ไขแม้กระทั่งผู้ใช้ที่ไม่ได้เข้าสู่ระบบ! มันไม่ใช่เรื่องใหญ่โต แต่อย่างใด
Flimm

1
นี่คือคำตอบด้วยตัวเองมันดี
Bruno Pereira

คุณสามารถใช้"${@:1}"แทนshiftแต่ต้องใช้bashแทนshใน#!shebang ของคุณ IMHO วิธีการเปลี่ยนแบบดั้งเดิมของคุณนั้นง่ายและดีขึ้น
MestreLion

6

ขณะนี้ไม่มีแอปพลิเคชันที่ทำสิ่งที่คุณอธิบายในคลังเก็บ Ubuntu มีความพยายามสองสามอย่างในการสร้างโซลูชันทั่วไปเพื่อให้มีการรวมสำหรับสภาพแวดล้อมเดสก์ท็อป (เช่น openbox) ที่ไม่สอดคล้องกับข้อกำหนด XDG เหล่านี้

Arch Linux กำลังทำงานเกี่ยวกับการนำ xdg-autostart มาใช้โดยอ้างอิงจากไลบรารี python-xdg จากสิ่งที่ฉันพบสิ่งนี้ดูเหมือนว่ายังไม่เสร็จสมบูรณ์ แต่มีรายงานความสำเร็จบางส่วน

นอกจากนี้ยังมีการใช้ cdd ของ xdg-autostart บน gitorious (http://gitorious.org/xdg-autostart/) ซึ่งน่าจะได้รับประโยชน์จากการใช้งานที่กว้างขึ้น

หากวิธีใดวิธีหนึ่งเหมาะกับคุณโปรดพิจารณาส่งงานที่จำเป็นเพื่อรวมไว้ใน Debian หรือ Ubuntu

ในการใช้เครื่องมือด้วย openstart คุณจะเรียกมันว่าใน /etc/xdg/openbox/autostart.sh (ถ้าฉันอ่านเอกสาร openbox อย่างถูกต้อง) หากวิธีนี้ใช้ไม่ได้คุณอาจเรียกได้ว่าเป็นสคริปต์การเริ่มต้นใช้งานเซสชัน openbox ใด ๆ


ไม่ใช่สิ่งที่ฉันอยากได้ยินขอขอบคุณข้อมูล
enzotib

6

ฉันไม่มีวิธีแก้ปัญหาในทันทีที่ตรงตามข้อกำหนดสำหรับ"การใช้คำสั่งมาตรฐาน"แต่ถ้าคุณต้องการแยกวิเคราะห์.desktopไฟล์น้อยที่สุดหรือต้องการสร้างนามแฝง Bash ดังนั้นสิ่งต่อไปนี้จะทำงาน:

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

อีกวิธีหนึ่งที่น่าสนใจคือการสร้างbinfmt-miscวิธีการระดับเคอร์เนลมากกว่าการจับคู่กับ.desktopไฟล์ (ดูgrep -r . /proc/sys/fs/binfmt_misc/รูปแบบที่คุณเปิดใช้งานในปัจจุบัน)

ในตอนท้ายของวันบางสิ่งบางอย่างจะต้องแยกวิเคราะห์.desktopไฟล์มันเป็นเพียงคำถามว่า "มาตรฐาน / ค่าเริ่มต้น" เป็นอย่างไร


ขอบคุณน่าสนใจ ในฐานะ "มาตรฐาน" ฉันหมายถึงบางสิ่งที่ DE จัดหาให้และสอดคล้องกับ freedesktop.org
enzotib

โหวตขึ้นสำหรับawkมากกว่าสายโซ่ของgreps และseds
jmtd

โหวตขึ้นแม้ว่ามันจะไม่ทำงาน (หรือดีกว่า - ทำงานมากเกินไป) ถ้าคุณมีExec=สายเหลือเฟือ: /
Boris Churzin

2

ฉันใช้สคริปต์จากคำตอบของคาร์โล ข้างต้นและพยายามปรับปรุงมันเพื่อการใช้งานเดสก์ท็อปของฉันเอง

สคริปต์เวอร์ชันนี้จะอนุญาตให้คุณเรียกใช้แอพใด ๆ ราวกับว่าคุณป้อนลงใน HUD ตราบใดที่มันน่าจะเป็นผลลัพธ์แรก นอกจากนี้ยังช่วยให้คุณส่งอาร์กิวเมนต์ไฟล์สำหรับไฟล์. esktop ที่ไม่สนับสนุน URIs

#!/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

เมื่อพยายามทดสอบไฟล์เหล่านี้ฉันพบวิธีที่ง่ายที่สุดในการตรวจสอบว่า DM หรือตัวจัดการเซสชันจะทำสิ่งที่ฉันคาดไว้คือเปิด dir ที่ล้อมรอบในเบราว์เซอร์โฟลเดอร์ UI จากนั้นดับเบิลคลิกเพื่อเปิดไฟล์

หากคุณอยู่ในบรรทัดคำสั่ง: gvfs-open .หรือgnome-open .จะเปิดในเบราว์เซอร์โฟลเดอร์ที่กำหนดค่าไว้

สิ่งที่ไม่ดีจะไม่สะท้อนพฤติกรรมของ DM รวมถึงสิ่งที่เที่ยวยุ่งยิ่งเช่นการหลบหนีและการอ้างอิงที่คุณไม่ต้องการพฤติกรรมทางเลือก มันไม่ใช่บรรทัดคำสั่ง แต่มันตรวจสอบสิ่งต่าง ๆ ฉันพบการตั้งค่าที่Terminal=trueมีประโยชน์สำหรับการดีบัก


เทอร์มินัลจะหายไปทันทีฉันไม่มีเวลาเห็นข้อความเมื่อใช้ Terminal = จริง: s
gouessej

1

คำตอบ SOนี้คือสิ่งที่ทำให้ฉันชัดเจน: อย่าพยายามเรียกใช้เดสก์ท็อปไฟล์รันไฟล์ที่ชี้ไปที่ไฟล์เดสก์ท็อป

ตัวอย่างเช่นรัน /home/jsmith/Desktop/x11vnc.sh

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

1

(รวบรวมจากคำตอบอื่น ๆ ที่นี่)

ขึ้นอยู่กับระบบของคุณและข้อบกพร่องต่าง ๆ ที่อาจมีหรือไม่มีอยู่ในระบบของคุณลองทำสิ่งต่อไปนี้จนกว่าจะมีหนึ่งในนั้นทำงาน:

  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

โปรดทราบว่าในระบบอูบุนตู "เมนูเริ่มต้น" /usr/share/applications/ปืนกลเดสก์ทอปของคุณที่มีอยู่ใน

เป็นตัวอย่างในการแสดงว่าคำสั่งข้างต้นใดที่ทำงานหรือไม่ทำงานบนระบบ Ubuntu 14.04 ของฉันนี่คือผลลัพธ์ของการเรียกดังต่อไปนี้สำหรับฉัน:

  1. xdg-open /usr/share/applications/eclipse_for_cpp.desktop # ล้มเหลวเนื่องจากข้อผิดพลาด (พยายามให้ฉันบันทึกไฟล์ .desktop นี้)
  2. exo-open /usr/share/applications/eclipse_for_cpp.desktop # ผลงาน
  3. gtk-launch /usr/share/applications/eclipse_for_cpp.desktop # ล้มเหลวด้วย "gtk-launch: ไม่มีแอปพลิเคชันดังกล่าว"
  4. kioclient exec /usr/share/applications/eclipse_for_cpp.desktop # ผลงาน
  5. dex /usr/share/applications/eclipse_for_cpp.desktop# ล้มเหลว & sudo apt install dexไม่สามารถค้นหาแพคเกจ dex

0

ตรวจสอบให้แน่ใจว่าสคริปต์ไฟล์เดสก์ท็อปของคุณชี้ไปที่สามารถเรียกใช้งานได้เช่นกัน

หากยังไม่ได้ผล ทำให้ไฟล์เดสก์ท็อปสามารถทำงานได้ในเทอร์มินัลโดยเปลี่ยนTerminal=trueและวางไว้ในสคริปต์ทุบตี รันสคริปต์เพื่อดักจับเอาต์พุตข้อผิดพลาด เปลี่ยนกลับเมื่อแก้ไขข้อผิดพลาด


0

คำตอบของ Hamish นั้นยอดเยี่ยม แต่ฉันอยากจะแนะนำทางเลือกที่ง่ายกว่าโดยมีการวางท่อน้อยกว่า:

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

ในกรณีนี้awkค้นหาบรรทัดที่ขึ้นต้นด้วยExecแล้วเราก็พิมพ์ฟิลด์หลังจากบรรทัดนั้นใช้สำหรับลูปและ=เราพิมพ์ฟิลด์ 2 นั่นคืออะไรก็ตามที่เกิดขึ้นหลังจากฟิลด์นั้น วงเล็บปีกกาที่ส่วนท้ายของคำสั่ง $(...),, คือการทดแทนพารามิเตอร์, ดังนั้นเชลล์จะดำเนินการสิ่งที่คำสั่ง awk ส่งกลับ; Exec=ในกรณีนี้ก็จะส่งกลับคำสั่งที่เกิดขึ้นจริงที่เกิดขึ้นหลังจากที่

ในบางกรณีที่หายากอาจมีมากกว่าหนึ่ง=สัญญาณซึ่งยังคงเป็นไปได้ สำหรับสิ่งที่ฉันแนะนำ

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

นิสัยดีawkและ Serg =)
AB

และบางครั้งก็มีTryExecบางทีคุณควรตรวจสอบคำสั่งที่ 2 ของคุณ =)
AB

@AB Hehe awkเป็นอาวุธที่ฉันเลือกเมื่อพูดถึงการประมวลผลข้อความ Cนอกจากนี้มันไวยากรณ์อยู่ใกล้กับ อ๋อและได้เพิ่มTryExecบางส่วนแล้ว^ _ ^
Sergiy Kolodyazhnyy

คุณมี +1 =)
AB

แต่สิ่งที่เกี่ยวกับ%f, %u, %Uหรืออะไรเช่นนี้ที่อยู่เบื้องหลังคำสั่งหรือไม่
AB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.