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

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

我有一个名为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

我该如何达到这个结果?

答案1

介绍

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

所以当你打开火狐每晚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

让我们调用我们的程序山寨.rb,并将其移动到 /tmp/ 目录。

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

/tmp/copycat.rb /tmp/AFile

如果存在重复的临时文件,这会将所有内容复制/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

不要忘记将该%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 应用程序。

答案2

case $1 in
 *txt)  applic=less ;;
 *html) applic=vim  ;;
esac

xterm -e $applic $1 &

简约,但经过测试。

您可以从第一个 xterm 调用此脚本。不要看case-esac,而是注意xterm-e& 符号。

相关内容