Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

วิธี Launch Flatpak จากเทอร์มินัล Linux

โมเดลการกระจายแอปพลิเคชัน Flatpak ช่วยให้นักพัฒนาสามารถเป้าหมาย Linux ได้ด้วยวิธีใหม่และง่าย และช่วยให้ผู้ใช้ Linux ติดตั้งแอปพลิเคชันมากขึ้นโดยไม่ต้องกังวลเกี่ยวกับว่าพวกเขาใช้ Linux version อะไร นี่เป็นเทคโนโลยีที่น่าตื่นเต้น และบนระบบ Fedora Silverblue ของผม มันคือวิธีติดตั้งแพ็กเกจเริ่มต้น แอปพลิเคชันเดสก์ท็อปทั้งหมดของผมบน Silverblue และหลายตัวที่ผมชอบบน Slackware ทำงานเป็น Flatpak

มีสิ่งหนึ่งที่ทำให้ Flatpak ค่อนข้าง clumsy ในบางกรณี และนั่นคือ命名 scheme ของมัน ตัวอย่างเช่น เมื่อผมติดตั้ง Emacs เป็น Flatpak มันจะถูกลงทะเบียนบนระบบของผมเป็น org.gnu.emacs สิ่งนี้ทำไว้ เพื่อป้องกันการทับซ้อนชื่อของแอปพลิเคชันระดับระบบที่มีอยู่ – หากผมมี Emacs ติดตั้งอยู่แล้ว ความแตกต่างระหว่าง /usr/bin/emacs และการติดตั้ง Flatpak ของ Emacs คืออะไร? เพื่อเหตุผลนี้ Flatpak เช่น Emacs จะถูกติดตั้งไปที่อย่างเช่น (เตรียมพร้อม) เส้นทางนี้:

/var/lib/flatpak/app/org.gnu.emacs/current/active/export/bin/org.gnu.emacs

มันไม่ได้ symlink จาก /usr/bin หรือ /opt ตำแหน่งไม่ได้ถูกเพิ่มเข้าไปใน path ของผู้ใช้ และการ launch Flatpak ต้องใช้การเรียกแบบนี้:

$ flatpak run org.gnu.emacs

นั่นคือการพิมพ์เยอะมาก เทียบกับแค่พิมพ์ emacs

ชื่อยากที่จะจำ

命名 scheme ของ Flatpak ยังสมมติว่าคุณใช้ Flatpak บ่อยพอที่จะจำชื่อ reverse DNS ของแพ็กเกจ นอกจากโครงสร้างแล้ว ไม่มีมาตรฐานสำหรับการตั้งชื่อ Flatpak ดังนั้น Flatpak หนึ่งอาจใช้ camel-case เช่น org.libreoffice.LibreOffice ในขณะที่อีกตัวอาจใช้ mixed case เช่น org.gimp.GIMP

บางชื่อง่ายต่อการจดจำกว่าอื่นๆ ตัวอย่างเช่น org.glimpse_editor.Glimpse จำง่าย ก็ต่อเมื่อ คุณจำได้ว่าเว็บไซต์คือ https://glimpse-editor.org แทนที่จะเป็น glimpse.org และ underscore แทน dash

จากมุมมองของนักพัฒนา Flatpak นี่ไม่ใช่ปัญหา เพราะ Flatpak ถูกตั้งใจให้ launch จากเดสก์ท็อป คุณไม่ต้องจำ org.gnu.emacs เพราะคุณสามารถ launch จาก GNOME Activities หรือ K-Menu หรือ graphical launcher อื่นๆ ได้เสมอ

สิ่งนี้เป็นจริงบ่อยพอ แต่บางครั้งสะดวกกว่าที่จะ launch แอปพลิเคชันจากเทอร์มินัล เพราะคุณกำลังใช้เทอร์มินัลอยู่แล้ว ไม่ว่าผมจะอยากได้รูปภาพใน Glimpse หรือไฟล์ข้อความใน Emacs หรือไฟล์เพลงใน VLC ผมบ่อยครั้งยุ่งเกินไปในเทอร์มินัลจนไม่ได้ "drop" ออกไปที่เดสก์ท็อป (แม้แค่หนึ่งปุ่ม!) launch แอปพลิเคชัน คลิกผ่านเมนูเพื่อเปิดไฟล์ และคลิกผ่านระบบไฟล์เพื่อหาไฟล์ที่อยากเปิด

มันแค่เร็วกว่าที่จะพิมพ์คำสั่งตามด้วยไฟล์ที่อยากเปิด แต่ถ้าผมต้องพิมพ์ flatpak run org.something.app มันก็ไม่เร็ว

การใช้ Bash aliases เพื่อ launch Flatpak

วิธีแก้ปัญหาที่ชัดเจนที่สุดสำหรับทั้งหมดนี้คือ Bash alias ด้วย Bash alias คุณสามารถกำหนดคำสั่ง tùy ý ให้กับคำใดๆ ที่คุณต้องการ มี Bash aliases ทั่วไปมากมาย ที่เกือบผู้ใช้ Linux ทุกคนมีบนระบบ ไม่ว่าจะโดยเจตนาหรือเพราะ distribution ตั้งค่าไว้ล่วงหน้า:

$ grep alias ~/.bashrc
 alias cp='cp -v'
 alias rm='/usr/bin/local/trashy'
 alias mv='mv -v'
 alias ls='ls --color'
 alias ll='ls -l --color'
 alias lh='ll -h'

คุณสามารถสร้าง aliases สำหรับ Flatpak ได้เช่นกัน:

alias emacs='flatpak run org.gnu.emacs'

ปัญหาแก้แล้ว!

การโต้ตอบที่ดีขึ้นกับ Bash scripting

ไม่ได้ใช้เวลานานสำหรับกระบวนการเพิ่ม aliases ด้วยตนเองจะรู้สึกยุ่งยากเกินไปสำหรับผม และสำหรับผม ไม่ใช่งานแต่เป็นกระบวนการ การเปิด editor และเพิ่ม alias นั้นรวดเร็วมาก แต่เป็นการหยุดชะงักใน workflow ของผม

สิ่งที่ผมอยากได้จริงๆ คือบางอย่างที่ผมสามารถ ทางจิตใจและกายภาพ เพิ่มเข้าไปในกระบวนการติดตั้ง Flatpak เริ่มต้น ตามที่ต้องการ ไม่ใช่ Flatpak ทุกตัวที่ผมติดตั้งต้องการ alias ตัวอย่างเช่น นี่คือรายการบางส่วนของ Flatpak บนระบบ Silverblue ของผม:

$ find /var/lib/flatpak/app/* -maxdepth 0 -type d | tail -n5
 /var/lib/flatpak/app/org.gnome.baobab
 /var/lib/flatpak/app/org.gnome.Calculator
 /var/lib/flatpak/app/org.gnome.Calendar
 /var/lib/flatpak/app/org.gnome.Characters
 /var/lib/flatpak/app/org.gnome.clocks
 /var/lib/flatpak/app/org.gnome.Contacts
 /var/lib/flatpak/app/org.gnome.eog
 /var/lib/flatpak/app/org.gnome.Evince
 /var/lib/flatpak/app/org.gnome.FileRoller
 /var/lib/flatpak/app/org.gnome.font-viewer
 /var/lib/flatpak/app/org.gnome.gedit
 /var/lib/flatpak/app/org.gnome.Logs
 /var/lib/flatpak/app/org.gnome.Maps
 /var/lib/flatpak/app/org.gnome.NautilusPreviewer
 /var/lib/flatpak/app/org.gnome.Rhythmbox3
 /var/lib/flatpak/app/org.gnome.Screenshot
 /var/lib/flatpak/app/org.gnome.Weather
 /var/lib/flatpak/app/org.gnu.emacs
 /var/lib/flatpak/app/org.signal.Signal

ผมจะไม่ launch Weather หรือ GNOME Calculator จากเทอร์มินัลเลย ผมจะไม่ launch Signal จากเทอร์มินัลเช่นกัน เพราะมันเป็นแอปที่ผมเปิดตอนต้นวันและไม่ปิดเลย

ดังนั้น ข้อกำหนดที่ผมกำหนดให้ตัวเองคือ:

  • เพิ่ม alias ตามที่ต้องการ (as-needed)
  • ควบคุมจากเทอร์มินัล เพื่อให้เข้ากับท้ายกระบวนการติดตั้ง Flatpak ได้สบาย
  • ทำหนึ่งอย่างและทำดี (does one thing and does it well)
  • พกพาได้ (Portable) ข้าม Fedora, RHEL, Slackware และ distro อื่นๆ ที่ผมอาจใช้ในสัปดาห์ใดสัปดาห์หนึ่ง

โซลูชันที่ผมเลือกใช้ gầnนี้คือ สคริปต์ Bash เล็กๆ ที่กำหนดเอง ซึ่งผมใช้เพื่อเพิ่ม aliases สำหรับ Flatpak ที่ผมรู้ว่าผมอยากเข้าถึงเร็วจากเทอร์มินัล นี่คือสคริปต์:

#!/bin/sh
 # GPLv3 appears here
 # gnu.org/licenses/gpl-3.0.md

 # vars
 SYMRC=.bashrc.d
 SYMDIR=$HOME/$SYMRC
 SYMFILE=flatpak_aliases

 # exit on errors
 set -e

 # this is where the aliases lives
 if [ ! -d $SYMDIR ]; then
 mkdir "${SYMDIR}"
 touch "${SYMDIR}"/"${SYMFILE}"
 fi

 sourcer() {
 echo 'Run this command to update your shell:'
 echo ". ${SYMDIR}/${SYMFILE}"
 }

 lister() {
 cat "${SYMDIR}"/"${SYMFILE}"
 }

 adder() {
 grep "alias ${ARG}=" "${SYMDIR}"/"${SYMFILE}" && i=1
 [[ $VERBOSE ]] && echo "$i"

 if [ $i -gt 0 ]; then
 echo "Alias for ${ARG} already exists:"
 grep "alias ${ARG}=" "${SYMDIR}"/"${SYMFILE}"
 exit
 else
 echo "alias ${ARG}='${COMMAND}'" >> "${SYMDIR}"/"${SYMFILE}"
 [[ $VERBOSE ]] && echo "Alias for ${ARG} added"
 sourcer
 fi

 unset i
 }

 remover() {
 echo "Removing stuff."
 sed -i "/alias ${ARG}=/d" "${SYMDIR}"/"${SYMFILE}"
 sourcer
 }

 # arg parse
 while [ True ]; do
 if [ "$1" = "--help" -o "$1" = "-h" ]; then
 echo " "
 echo "$0 add --command 'flatpak run org.gnu.emacs' emacs # create symlink for emacs"
 echo "$0 add --command 'flatpak run org.gnu.emacs -fs' emacs-fs # create symlink for emacs in fullscreen"
 echo "$0 remove emacs # remove emacs symlink"
 echo "$0 list # list all active flatpak symlinks"
 echo " "
 exit
 elif [ "$1" = "--verbose" -o "$1" = "-v" ]; then
 VERBOSE=1
 shift 1
 elif [ "$1" = "list" ]; then
 MODE="list"
 shift 1
 elif [ "$1" = "add" ]; then
 MODE="add"
 shift 1
 elif [ "$1" = "remove" ]; then
 MODE="remove"
 shift 1
 elif [ "$1" = "--command" -o "$1" = "-c" ]; then
 COMMAND="${2}"
 shift 2
 else
 break
 fi
 done

 #create array, retain spaces
 ARG=( "${@}" )

 case $MODE in
 add)
 adder
 ;;
 list)
 lister
 ;;
 remove)
 remover
 ;;
 *)
 echo "You must specify an action <list|add|remove>"
 exit 1
 esac

การใช้สคริปต์

วิธี Launch Flatpak จากเทอร์มินัล Linux

เมื่อผมติดตั้ง Flatpak ที่ผมคาดว่าจะอยาก launch จากเทอร์มินัล ผมจบกระบวนการด้วยสคริปต์นี้:

$ flatpak install org.gnu.emacs
 $ pakrat add -c 'flatpak run org.gnu.emacs' emacs
 Alias for emacs added.
 Run this command to update your shell:
 . ~/.bashrc.d/flatpak_aliases

 $ . ~/.bashrc.d/flatpak_aliases

หาก alias มีอยู่แล้ว จะถูกตรวจพบ และไม่สร้าง alias ใหม่

ผมสามารถลบ alias ได้ด้วย:

$ pakrat remove emacs

สิ่งนี้ไม่ลบ Flatpak และทำงานเฉพาะกับไฟล์ flatpak_aliases ที่แยกไว้

Flatpak aliases ทั้งหมดถูกเพิ่มไปที่ ~/.bashrc.d/flatpak_aliases ซึ่งคุณสามารถ source อัตโนมัติเมื่อ shell เริ่มต้น โดยวางโค้ดแบบนี้ลงใน .bashrc หรือ .bash_profile หรือ .profile ของคุณ:

if [ -d ~/.bashrc.d ]; then
 for rc in ~/.bashrc.d/*; do
 if [ -f "$rc" ]; then
 . "$rc"
 fi
 done
 fi

 unset rc

Flatpak launching made easy

Flatpak ผสานรวมกับเดสก์ท็อป Linux ได้ดีมาก และมีโครงสร้างพื้นฐานที่แข็งแกร่ง reproducible พวกมันสร้างได้ค่อนข้างง่าย และใช้งานสบายมาก ด้วยความพยายามเพิ่มเติมเล็กน้อย คุณสามารถนำพวกมันลงมาสู่เทอร์มินัล เพื่อให้คุณสามารถใช้งานได้ในทุกวิธีที่เหมาะกับคุณ น่าจะมีโปรเจกต์อื่นๆ ที่คล้ายกันหลายโปรเจกต์ และอาจมีบางโปรเจกต์ใน development ที่ advanced กว่าสคริปต์ Bash เรียบๆ นี้ แต่นี่ทำงานดีสำหรับผมจนถึงตอนนี้ ลองใช้ดู หรือแบ่งปันโซลูชันกำหนดเองของคุณในความคิดเห็น!