Flatpak 应用程序分发模型正在以一种新的、简便的方式帮助开发者针对 Linux,并且它正在帮助 Linux 用户安装更多应用程序,而无需担心他们运行的是哪个版本的 Linux。这是一项令人兴奋的技术,在我的 Fedora Silverblue 系统上,它是默认的软件包安装方法。我在 Silverblue 上安装的所有桌面应用程序,以及我在 Slackware 上使用的几个我最喜欢的应用程序,都作为 Flatpak 运行。
然而,在某些情况下,有一件事使 Flatpak 有点笨拙,那就是它的命名方案。例如,当我将 Emacs 作为 Flatpak 安装时,它在我的系统上注册为 org.gnu.emacs
。这样做显然是为了避免与现有系统级应用程序的名称冲突——如果我已经安装了 Emacs,那么 /usr/bin/emacs
和 Flatpak 安装的 Emacs 之间有什么区别呢?因此,像 Emacs 这样的 Flatpak 会安装到类似(准备好了吗)这样的路径
/var/lib/flatpak/app/org.gnu.emacs/current/active/export/bin/org.gnu.emacs
它没有从 /usr/bin
或 /opt
符号链接,该位置没有添加到用户的路径中,并且启动 Flatpak 需要像这样的调用
$ flatpak run org.gnu.emacs
与仅仅输入 emacs
相比,这需要输入很多内容。
名称很难记住
Flatpak 命名方案还假设您经常使用 Flatpak,以至于可以记住软件包的反向 DNS 名称。除了结构之外,没有命名 Flatpak 的标准,因此一个 Flatpak 可以使用驼峰式命名,例如 org.libreoffice.LibreOffice
,而另一个可能使用混合式命名,例如 org.gimp.GIMP
。
有些名称也比其他名称更容易记住。例如,只有当您记住它的网站是 http://glimpse-editor.org 而不是 glimpse.org,并且下划线代替了破折号时,org.glimpse_editor.Glimpse
才容易记住。
从 Flatpak 开发人员的角度来看,这不是问题,因为 Flatpak 旨在从桌面启动。您不必记住 org.gnu.emacs
,因为您可以始终从 GNOME Activities 或您的 K 菜单或类似的图形启动器启动它。
这种情况通常是正确的,但有时从终端启动应用程序更方便,因为您已经在终端中使用它了。无论我想要 Glimpse 中的图像、Emacs 中的文本文件还是 VLC 中的音乐文件,我都经常在终端中忙得不可开交,无法“退出”到桌面(即使它只差一个按键!),启动应用程序,点击菜单打开文件,然后点击我的文件系统找到我要打开的文件。
只需键入命令,后跟我要打开的文件,这样更快。但是如果我必须键入 flatpak run org.something.app
,那就不是了。
使用 Bash 别名启动 Flatpak
解决所有这些问题的显而易见的方案是 Bash 别名。使用 Bash 别名,您可以将任何任意命令分配给几乎任何您想要的单词。几乎每个 Linux 用户的系统上都有许多 常用 的 Bash 别名,这要么是自觉的选择,要么是因为发行版预设了它们
$ 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'
您也可以为 Flatpak 创建别名
alias emacs='flatpak run org.gnu.emacs'
问题解决了!
更好地与 Bash 脚本交互
手动添加别名的过程很快就让我觉得太费力了。对我来说,重要的不是任务,而是过程。打开编辑器并添加别名非常快,但它会中断我的工作流程。
我真正想要的是我可以根据需要附加到初始 Flatpak 安装过程中的东西,无论是在精神上还是在物理上。并非我安装的所有 Flatpak 都需要别名。例如,这是我的 Silverblue 系统上 Flatpak 的部分列表
$ 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
我永远不会从终端启动天气或 GNOME 计算器。我也永远不会从终端启动 Signal,因为它是我在一天开始时打开并且永远不会关闭的应用程序。
因此,我为自己定义的需求是
- 根据需要添加别名
- 基于终端的控制,因此它可以舒适地放在我的 Flatpak 安装过程的末尾
- 专注做好一件事
- 可在 Fedora、RHEL、Slackware 以及我碰巧在一周内使用的任何其他发行版上移植
我最近确定的解决方案是一个定制的 Bash 脚本,我使用它为我知道我想从终端快速访问的 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 > 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
使用脚本

当我安装一个我希望从终端启动的 Flatpak 时,我使用这个脚本完成该过程
$ 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
如果别名已存在,则会被发现,并且不会创建新的别名。
我也可以删除别名
$ pakrat remove emacs
这不会删除 Flatpak,并且仅对专用的 flatpak_aliases
文件进行操作。
所有 Flatpak 别名都添加到 ~/.bashrc.d/flatpak_aliases
,当您的 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 启动变得容易
Flatpak 与桌面 Linux 集成得非常好,并且它们背后有强大的、可重现的基础架构。它们相对容易构建,并且使用起来非常轻松。只需稍加努力,您就可以将它们带入终端,以便您可以以最适合您的方式使用它们。可能还有其他几个类似的项目,并且可能有一些正在开发中的项目比简单的 Bash 脚本更先进,但到目前为止,这个脚本对我来说效果很好。试用一下,或在评论中分享您的自定义解决方案!
评论已关闭。