Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Cách Chạy Flatpak Từ Terminal Linux

Mô hình phân phối ứng dụng Flatpak đang giúp developer nhắm mục tiêu Linux theo cách mới và dễ dàng, và giúp người dùng Linux cài nhiều ứng dụng hơn mà không lo về phiên bản Linux họ đang chạy. Đây là công nghệ thú vị, và trên hệ thống Fedora Silverblue của tôi, đó là phương pháp cài gói mặc định. Tất cả ứng dụng desktop của tôi trên Silverblue và một vài ứng dụng yêu thích tôi dùng trên Slackware đang chạy dưới dạng Flatpak.

Có một điều khiến Flatpak hơi khó chịu trong một số trường hợp, và đó làcheme đặt tên của nó. Ví dụ, khi tôi cài Emacs như Flatpak, nó được đăng ký trên hệ thống của tôi như org.gnu.emacs. Điều này được làm, rõ ràng, vì sợ ghi đè tên ứng dụng cấp hệ thống hiện có – nếu tôi đã cài Emacs, thì sự khác biệt giữa /usr/bin/emacs và cài đặt Flatpak của Emacs là gì? Vì lý do này, một Flatpak như Emacs được cài vào đường dẫn kiểu như (chuẩn bị tinh thần nhé) này:

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

Nó không được symlink từ /usr/bin hoặc /opt, vị trí không được thêm vào PATH của người dùng, và chạy Flatpak yêu cầu lệnh gọi như sau:

$ flatpak run org.gnu.emacs

Đó là nhiều gõ hơn so với chỉ gõ emacs.

Tên Khó Nhớ

Scheme đặt tên Flatpak cũng giả định bạn dùng Flatpak đủ thường để nhớ tên reverse DNS của gói. Bên cạnh cấu trúc, không có tiêu chuẩn cho đặt tên Flatpak, nên một Flatpak có thể dùng camel-case, như org.libreoffice.LibreOffice, trong khi cái khác dùng kiểu kết hợp, như org.gimp.GIMP.

Một số tên dễ nhớ hơn cái khác. Ví dụ, org.glimpse_editor.Glimpse dễ nhớ chỉ nếu bạn nhớ trang web là https://glimpse-editor.org, thay vì glimpse.org, và gạch dưới thay cho gạch ngang.

Từ góc độ nhà phát triển Flatpak, đây không phải vấn đề vì Flatpak dự định được chạy từ desktop. Bạn không cần nhớ org.gnu.emacs vì bạn luôn có thể chạy nó từ GNOME Activities hoặc K-Menu hoặc trình chạy đồ họa tương tự.

Điều này đúng thường xuyên, nhưng đôi khi thuận tiện hơn chạy ứng dụng từ terminal vì bạn đã đang dùng terminal. Dù tôi muốn ảnh trong Glimpse hay tệp văn bản trong Emacs hay tệp nhạc trong VLC, tôi thường quá bận trong terminal để "rời" ra desktop (dù chỉ một phím!), chạy ứng dụng, click qua menu để mở tệp, rồi click qua hệ thống tệp để tìm tệp tôi muốn mở.

Chỉ cần gõ lệnh theo sau bởi tệp tôi muốn mở thì nhanh hơn. Nhưng nếu phải gõ flatpak run org.something.app, thì không nhanh.

Dùng Alias Bash Để Chạy Flatpak

Giải pháp rõ ràng cho tất cả điều này là alias Bash. Với alias Bash, bạn có thể gán bất kỳ lệnh tùy ý nào cho gần như bất kỳ từ nào bạn muốn. Có nhiều alias Bash phổ biến hầu như mọi người dùng Linux đều có trên hệ thống, hoặc bằng chọn lựa ý thức hoặc vì bản phân phối cài sẵn:

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

Bạn có thể tạo alias cho Flatpak, cũng vậy:

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

Vấn đề giải quyết!

Tương Tác Tốt Hơn Với Script Bash

Không mất bao lâu để quá trình thêm alias thủ công cảm thấy quá vất vả. Với tôi, không phải tác vụ mà là quá trình. Mở editor và thêm alias nhanh lắm, nhưng nó làm gián đoạn workflow.

Cái tôi thực sự muốn là thứ tôi có thể, về mặt tinh thần và thể chất, nối thêm vào quy trình cài Flatpak ban đầu khi cần. Không phải tất cả Flatpak tôi cài cần alias. Ví dụ, đây là danh sách một phần Flatpak trên Silverblue của tôi:

$ 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

Tôi sẽ không bao giờ chạy Weather hoặc GNOME Calculator từ terminal. Tôi cũng không bao giờ chạy Signal từ terminal, vì đó là ứng dụng tôi mở đầu ngày và không bao giờ đóng.

Do đó, yêu cầu tôi tự đặt ra là:

  • Thêm alias khi cần
  • Điều khiển từ terminal, phù hợp ở cuối quy trình cài Flatpak
  • Làm một việc và làm tốt
  • Di động trên Fedora, RHEL, Slackware, và bất kỳ distro nào tôi dùng tuần nào

Giải pháp tôi chọn gần đây là script Bash tùy chỉnh nhỏ tôi dùng để thêm alias cho Flatpak tôi biết mình muốn truy cập nhanh từ terminal. Đây là script:

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

Dùng Script

Cách Chạy Flatpak Từ Terminal Linux

Khi tôi cài Flatpak tôi dự định muốn chạy từ terminal, tôi kết thúc quy trình với script này:

$ 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

Nếu alias đã tồn tại, nó được phát hiện, và không tạo alias mới.

Tôi cũng có thể xóa alias:

$ pakrat remove emacs

Điều này không xóa Flatpak và chỉ hoạt động trên tệp flatpak_aliases chuyên dụng.

Tất cả alias Flatpak được thêm vào ~/.bashrc.d/flatpak_aliases, bạn có thể tự động source khi shell khởi động bằng cách đặt mã kiểu này vào tệp .bashrc hoặc .bash_profile hoặc .profile:

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

unset rc

Chạy Flatpak Dễ Dàng

Flatpak tích hợp rất tốt với Linux desktop, và chúng có cơ sở hạ tầng mạnh mẽ, reproducible đằng sau. Chúng khá dễ build và dễ dùng. Với chỉ một chút nỗ lực thêm, bạn có thể kéo chúng xuống terminal để dùng chúng theo cách nào tốt nhất cho bạn. Có lẽ một vài dự án khác như này và có một vài đang phát triển xa hơn nhiều hơn script Bash đơn giản, nhưng cái này hoạt động tốt cho tôi cho đến nay. Thử nó, hoặc chia sẻ giải pháp tùy chỉnh của bạn trong bình luận!