Flatpak 애플리케이션 배포 모델은 개발자가 새롭고 쉬운 방식으로 리눅스를 지원할 수 있게 해주고, 사용자 역시 자신이 어떤 리눅스 배포판을 쓰는지 신경 쓰지 않고도 다양한 애플리케이션을 설치할 수 있도록 도와줍니다. 필자의 경우 Fedora Silverblue 시스템에서는 Flatpak이 기본 패키지 설치 방식이며, 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에서 심볼릭 링크로 연결되지도 않고, 해당 위치가 사용자 PATH에 추가되지도 않기 때문에 Flatpak을 실행하려면 다음과 같이 입력해야 합니다.
$ flatpak run org.gnu.emacs
그냥 emacs라고 입력하는 것에 비하면 타이핑할 내용이 너무 많습니다.
이름을 기억하기 어려운 문제
Flatpak의 명명 체계는 사용자가 해당 패키지의 역방향 DNS(reverse DNS) 이름을 기억할 만큼 자주 사용한다고 가정합니다. 구조 자체 외에는 이름 규칙에 대한 표준이 없어서, 어떤 Flatpak은 카멜 케이스(camel-case)를 쓰고(org.libreoffice.LibreOffice), 어떤 것은 혼합 방식을 씁니다(org.gimp.GIMP).
이름마다 기억 난이도도 다릅니다. 예를 들어 org.glimpse_editor.Glimpse는 웹사이트가 glimpse.org가 아니라 glimpse-editor.org라는 점, 그리고 하이픈(-) 대신 밑줄(_)이 쓰였다는 점을 기억하고 있을 때에만 쉽게 떠올릴 수 있습니다.
Flatpak 개발자 입장에서는 이것이 문제가 아닙니다. Flatpak은 애초에 데스크톱 환경에서 실행되도록 설계되었기 때문입니다. GNOME Activities나 K-Menu 같은 그래픽 런처에서 언제든 실행할 수 있으므로 org.gnu.emacs를 외울 필요가 없습니다.
대체로 맞는 말이지만, 이미 터미널 작업 중이라면 터미널에서 바로 애플리케이션을 실행하는 편이 훨씬 편리할 때가 많습니다. Glimpse로 이미지를 열거나, Emacs로 텍스트 파일을 편집하거나, VLC로 음악을 재생하고 싶을 때마다 데스크톱으로 전환하고(키 하나면 되긴 하지만!), 앱을 실행하고, 메뉴를 클릭해 파일 열기를 선택하고, 파일 시스템을 탐색해 원하는 파일을 찾아야 한다면 번거롭기 짝이 없습니다.
명령어와 함께 열고 싶은 파일 경로를 입력하는 것이 훨씬 빠릅니다. 하지만 flatpak run org.something.app을 매번 입력해야 한다면 이야기가 달라집니다.
Bash 별칭(alias)으로 Flatpak 실행하기
이 문제에 대한 가장 직관적인 해결책은 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 등 그 주에 쓰는 어떤 배포판에서도 이식 가능할 것
최근 정착한 해결책은 터미널에서 빠르게 호출하고 싶은 Flatpak에 별칭을 추가해 주는 작은 커스텀 Bash 스크립트입니다. 스크립트 전문은 다음과 같습니다.
#!/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에 저장됩니다. 다음 코드를 .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은 리눅스 데스크톱과 잘 통합되어 있고, 강력하면서도 재현 가능한 인프라를 기반으로 합니다. 빌드도 비교적 쉽고 사용도 간편합니다. 여기에 약간의 노력만 더하면 터미널 환경까지 아우를 수 있어, 자신에게 가장 편한 방식으로 활용할 수 있습니다. 이보다 훨씬 발전된 유사 프로젝트들이 이미 존재하거나 개발 중일 수 있지만, 이 간단한 Bash 스크립트는 지금까지 필자에게 잘 맞았습니다. 직접 사용해 보거나, 여러분만의 커스텀 해결책을 댓글로 공유해 보세요!