web-dev-qa-db-ja.com

Linuxのカスタム実行可能ファイルで「開く」はどのように機能しますか?

foo.txtというファイルがあります。自分のプログラムをmime-type.txtに関連付けて、プログラムがターミナルを開き、foo.txtの内容を標準出力として表示できるようにします。 Rubyが好きですが、BASHスクリプトでも問題ありません。

実例:firefoxでHTMLファイルを開くことができます。同じ方法で自分の実行可能ファイルを使用してtxtファイルを開きたい。

どうすれば実際に機能させることができるのかわかりません。

例2:Geany/Mousepad/Atom/Codeなどで.txtファイルを開くことができます。マウスパッドのようなツールを作成したとしましょう。私のプログラムは.txt mimetypeをどのように処理する必要がありますか?

これまで、Rubyで小さなGUIプログラムを作成し、それを実行可能にして、プログラムでfoo.txtを開こうとしました(Nemoファイルマネージャーを使用しました)。引数をキャプチャしました。と私のRubyプログラムのstdinsなので、引数とSTDINがあれば表示されます。しかし、.txtファイルを開いても、プログラムはウィンドウに表示されません。

どのように私は結果を達成することになっていますか?

2
S.Goswami

前書き

ファイルがアプリケーションで開かれると、ファイルは引数としてアプリケーションに渡されるだけです。

したがって、/bin/にあるfirefox-nightlyを開き、p.htmlにある/home/user/を開くと、基本的には次のようになります。 /bin/firefox-nightly /home/user/p.htmlを実行します。

実行可能ファイルの作成

質問で述べたように:

これまで、Rubyで小さなGUIプログラムを作成し、それを実行可能にして、プログラムでfoo.txtを開こうとしました(Nemoファイルマネージャーを使用しました)。

引数として渡されたファイルの内容を/tmp/tempfile-#{n}にコピーする、OPの要求に応じてRubyプログラムを作成しましょう。受け入れることができれば、どのプログラミング言語でも機能することに注意してください。コマンドライン引数。

#!/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

そして、プログラムcopycat.rbを呼び出して、/ tmp /ディレクトリに移動しましょう。

私たちは確かにこのような端末でプログラムを実行することができます:

/tmp/copycat.rb /tmp/AFile

これにより、/tmp/AFileのすべての内容が/tmp/tempfile-#{n}にコピーされます。ここで、#{n}は、重複する一時ファイルが存在する場合のカウントです。

アプリケーションエントリの作成

ファイルマネージャからプログラムでこれを開くには、アプリケーションエントリを作成する必要があります。そのためには、2つのオプションがあります。 最初のオプションは

$HOME/.local/share/applicationsにcopycat.desktopというファイルを次の内容で作成します。

[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

Execで始まる行に%uオプションを追加することを忘れないでください。

テスト

さて、テストするために、「helloworld」というコンテンツまたは必要なものを含む単純なファイルを作成しましょう。ファイルマネージャを開き、ファイル上でマウスの2番目のボタンをクリックして、[プログラムから開く]または同様のオプションを選択します。 GUIに関連しているので、サンプル画像をいくつか追加します。

  1. Nautilus、「他のアプリケーションで開く」:

    Nautilus, "Open With Other Application"

  2. Nautilus、「すべてのアプリケーションを表示」:

    Nautilus, "View All Applications"

  3. 「CopyCat」:

    "CopyCat"

  4. 完了すると、tempfile-#{n}で作成された/tmp/を確認できます。

    enter image description here

ここで使用したファイルマネージャーはNautilusですが、これは他のファイルマネージャーでも機能するはずです。テキストだけが異なる場合があります。

2番目のオプションはで、すべてのユーザーがアプリケーションを利用できるようにします。これを行うには、ファイルを$HOME/.local/share/applications/copycat.desktopから/usr/share/applicationsに移動し、所有権をrootに変更する必要があります。

これは、Linuxでカスタム実行可能ファイルを使用したオープンがどのように機能するかを示しています。同様のGUIアプリを作成し、同じ方法で開くことができます。

2
S.Goswami
case $1 in
 *txt)  applic=less ;;
 *html) applic=vim  ;;
esac

xterm -e $applic $1 &

ミニマルですが、テスト済みです。

このスクリプトは、最初のxtermから呼び出すことができます。 case-esacは見ないでください。ただし、xtermには-eとアンパサンドを付けてください。

1
rastafile