如何从命令行使用 flatpak okular 打开文件?

如何从命令行使用 flatpak okular 打开文件?

我有一个与 flatpak 一起安装的 okular 别名,设置如下:

alias okular="org.kde.okular"

它可以从终端打开。但是,如果我尝试使用该别名从终端打开文件,例如:

okular document.pdf

那么就不行了。我究竟做错了什么?

有没有办法使用 okular flatpak 在终端中打开文件,而不是使用 GUI?

更新:

所以我找到了这个关联:

--file-forwarding 如果指定此选项,则扫描剩余的参数,并且包含在一对“@@”参数之间的所有参数都被解释为文件路径,在文档存储中导出,并传递给命令结果文档路径的形式。 '@@u' 和 '@@' 之间的参数被视为 uri,并且任何 file: uri 都会被导出。导出是非持久性的,并且具有应用程序的读写权限。

当然,这并不意味着使用 okular flatpak 在终端中打开文件的唯一方法是执行以下操作:

flatpak run okular.kde.org --file-forwarding @/home/user/documents/document.pdf@

我无法对每个要打开的 pdf 都执行此操作。如何将其添加为别名,以便在打开不同的 pdf 时不需要键入很长的命令?

答案1

一个 shell 函数,flatpak以您显示的方式调用,并在@给定(单个)参数之前和之后添加(未经测试,因为我不运行flatpak):

okular () {
    flatpak run org.kde.okular --file-forwarding "@$1@"
}

这将放在您放置普通别名的任何地方,并且您可以将其用作

okular /home/user/documents/document.pdf

在命令行上。


要使函数接受任意数量的参数,您可以使用类似的东西

okular () {
    for arg do
        set -- "$@" "@$arg@"
        shift
    done

    flatpak run org.kde.okular --file-forwarding "$@"
}

该循环添加@到每个命令行参数的开头和结尾。

这将使您能够将其用作

okular *.pdf

答案2

这些示例略有偏差,如下所示(此处使用 Firefox):

flatpak run --file-forwarding org.mozilla.firefox @@ file.pdf @@

路径可以是相对的;该文档应该是独立的(这不适用于某些已保存的 HTML 页面)。

答案3

在尝试了现有的答案之后,看起来正确的方法是将前导和尾随@@作为自己的参数,并在所有文件参数周围使用一对。

flatpak run --file-forwarding okular.kde.org @@ *.pdf @@

此外,@@u会将文件系统路径转换为file://​​URL,因此,如果您有一个接受两者的应用程序(例如 Firefox 或 Ungoogled Chromium 的 Flatpak 副本),请@@u "$@" @@在您的包装器中使用。

这是我纳入的概念证明我的剧本用于为我的 Flatpak 应用程序生成启动器包装器:

# Add this to the end of your $PATH
BIN_DIR=~/.local/bin/flatpak

# Remove any stale launch scripts
rm -f "$BIN_DIR"/*
mkdir -p "$BIN_DIR"

for X in $(flatpak list --columns=ref); do
    app_command="$(flatpak info -m "$X" | grep command= | cut -d= -f2)"
    cmd_path="$BIN_DIR"/"$app_command"

    if [ -n "$app_command" ]; then
        # Unset LD_PRELOAD to silence gtk-nocsd errors and support file
        # forwarding so you can sandbox browsers and still open local files
        printf '#!/bin/sh\nunset LD_PRELOAD\nexec flatpak run --file-forwarding "%s" @@u "$@" @@' "$X" >"$cmd_path"
        chmod +x "$cmd_path"
    fi
done

正如要点版本上的警告列表所说,它并不完美,因为您必须在拒绝 URL 或将本地路径强制转换为file://URL 之间进行选择,但它适用于我拥有的应用程序。

(正确的解决方案是用 Python 或 Rust 等重写包装器生成器,并让它解析Exec关联.desktop文件中的键以找出每个应用程序想要的内容。)

答案4

好吧...你已经找到了解决方案。

至于别名,这是一个标准的 Linux 事物(即与 flatpak 无关),所以这应该有效:

alias okular='echo flatpak run okular.kde.org --file-forwarding'

相关内容