从 Linux 终端启动 Flatpak

使用 Bash 别名启动 Flatpak 应用程序,而无需退出终端到桌面环境。
55 位读者喜欢这篇文章。

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

使用脚本

Launching a Flatpak from a terminal

当我安装一个我希望从终端启动的 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 脚本更先进,但到目前为止,这个脚本对我来说效果很好。试用一下,或在评论中分享您的自定义解决方案!

接下来阅读什么

您离不开的 Bash 别名

厌倦了一遍又一遍地输入相同的长命令?您是否觉得在命令行上工作效率低下?Bash 别名可以带来天壤之别。

(团队,红帽)
2019 年 7 月 31 日

如何构建 Flatpak

一种通用的软件包格式,具有去中心化的分发方式。此外,还具有可移植性和沙箱化功能。

(团队,红帽)
2019 年 10 月 21 日
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时从事这两个行业。

评论已关闭。

© . All rights reserved.