Linux 中的“打开方式”自定义可执行文件如何工作?

S.G*_*ami 3 bash ruby mime-types

我有一个名为foo.txt. 我想将我自己的程序与 mime 类型关联起来,.txt以便我的程序打开一个终端并将 的内容显示foo.txt为标准输出。我更喜欢 Ruby,但 BASH 脚本也可以。

一个有效的示例:我可以使用firefox. 我想以txt同样的方式用我自己的可执行文件打开文件。

我不知道如何才能真正让它发挥作用?

示例 2:我可以.txt使用 Geany/Mousepad/Atom/Code 等打开文件。假设我制作了一个像鼠标垫一样的工具。我的程序应该如何处理.txtmimetype?

到目前为止,我已经用 Ruby 制作了一个小型 GUI 程序,并使其可执行,并尝试foo.txt用我的程序打开(我使用 Nemo 文件管理器)。我已经在 Ruby 程序中捕获了参数和标准输入,因此它将显示参数和 STDIN(如果有)。.txt但是,如果我用它打开文件,我的程序甚至不会显示窗口!

我该如何达到这个结果?

S.G*_*ami 5

介绍

当使用应用程序打开文件时,该文件只是作为参数传递给应用程序。

因此,当您打开firefox-nightly located in/bin/p.htmllocated in时/home/user/,它基本上与 run 类似/bin/firefox-nightly /home/user/p.html

创建可执行文件

正如问题中提到的:

到目前为止,我已经用 Ruby 制作了一个小型 GUI 程序,并使其可执行,并尝试用我的程序打开 foo.txt(我使用了 Nemo 文件管理器)。

让我们按照 OP 的要求创建一个 Ruby 程序,它将复制作为参数传递给/tmp/tempfile-#{n}. 请注意,任何可以接受命令行参数的编程语言都可以工作。

#!/usr/bin/env ruby

# Errors
ERR_NO_FILE = 2

FILE = $*[0]

begin
    tempfile, counter = File.join(%W(/ tmp tempfile)), 0
    tempfile.replace(File.join(%W(/ tmp tempfile-#{counter += 1}))) while File.exist?(tempfile)
    IO.write(tempfile, IO.read(FILE))
rescue Errno::ENOENT
    exit!(ERR_NO_FILE)
rescue Interrupt, SystemExit, SignalException
    exit!(0)
rescue Exception
    abort($!.backtrace.join(?\n))
end if FILE
Run Code Online (Sandbox Code Playgroud)

让我们将程序命名为copycat.rb,并将其移动到 /tmp/ 目录。

我们当然可以在终端上运行该程序,如下所示:

/tmp/copycat.rb /tmp/AFile
Run Code Online (Sandbox Code Playgroud)

如果存在重复的临时文件,这会将所有内容复制/tmp/AFile/tmp/tempfile-#{n} 其中的计数。#{n}

创建应用程序条目

现在,要使用文件管理器中的程序打开它,我们需要创建一个应用程序条目。为此,我们有两个选择。第一个选项是

在 中创建一个名为 copycat.desktop 的文件$HOME/.local/share/applications,其中包含以下内容:

[Desktop Entry]
Version=1.0
Type=Application
Name=CopyCat
Comment=Copy the contents of a file to /tmp/tempfile#{n}
Exec=/tmp/copycat.rb %u
Icon=edit-copy
Path=
Terminal=false
StartupNotify=false
Actions=
Categories=Copy;Utility
Run Code Online (Sandbox Code Playgroud)

不要忘记将该%u选项添加到以 Exec 开头的行中。

测试

好吧,为了测试,让我们创建一个名为“hello world”或任何您想要的内容的简单文件。打开文件管理器,然后在文件上单击辅助鼠标按钮,然后选择“打开方式”或类似选项。因为它与 GUI 相关,所以我将添加一些示例图片。

  1. Nautilus,“用其他应用程序打开”:

    Nautilus,“用其他应用程序打开”

  2. 鹦鹉螺,“查看所有应用程序”:

    鹦鹉螺,“查看所有应用程序”

  3. “山寨”:

    “山寨”

  4. 完成后可以看到tempfile-#{n}创建的/tmp/

    在此输入图像描述

我在这里使用的文件管理器是 Nautilus,但这也应该适用于其他文件管理器,只是文本可能有所不同。

第二个选项是使该应用程序可供所有用户使用。为此,您必须将文件从$HOME/.local/share/applications/copycat.desktop移至/usr/share/applications并将所有权更改为 root。

这就是在 Linux 中使用自定义可执行文件打开的方式。可以用相同的方式创建和打开类似的 GUI 应用程序。