バックグラウンドでプログラムを起動するときの xdg-open の例外

バックグラウンドでプログラムを起動するときの xdg-open の例外

これまでは xdg-open のエイリアスを使用していました。

alias o='xdg-open $@ 2> /dev/null'

xdg-open のデフォルトの動作は、現在選択されているターミナルのフォアグラウンドでプロセスを開始することです。そのため、たとえば、vim に関連付けられたファイル (xdg-mime 経由) を開くと、コマンドが入力されたターミナルでエディターが開かれます。

問題は、mutt や vim などのターミナル ベースのプログラムを開くと正常に動作するものの、たとえば .html ファイルはデフォルトのブラウザーで開かれ、プロセスがフォアグラウンドで実行され、ファイルが閉じられるのを待機しているため、ターミナル ウィンドウが使用できなくなることでした。

現在使用しているターミナルからファイルを開いて、同じウィンドウで作業できるように、以下の関数を作成しました。

function o(){ xdg-open $@ 2> /dev/null & }

問題は解決しましたが、たとえば vim に関連付けられたファイルを開くと PID が表示され、エディターにアクセスするには $ fg と入力する必要があります。

少なくとも新しいターミナルで起動するように vim.desktop エントリを編集しようとしましたが、これはかなり悪い回避策だと思います。これを適切に解決する方法について、誰かヒントをくれませんか? よろしくお願いします。

答え1

xdg-openビューア プログラムを実行し、完了するまで待機するように設計されています。バックグラウンドで実行するようには設計されておらず、おわかりのように、うまく動作しない可能性があります。プログラムをフォアグラウンドで実行する古い mailcap システムでも同じ問題が発生します。

シェル関数を常に新しいターミナルで開くように変更することは可能ですが、そうすると無駄なターミナルが大量に発生する可能性があります。関数をより便利にし、希望どおりに動作させるには、次のようにします。

o () {
    for i in "$@"
    do
        mimetype=$(xdg-mime query filetype "$i")
        prog=$(xdg-mime query default "$mimetype")
        if grep -qs Terminal=true "/usr/share/applications/$prog"
        then
            xdg-open "$i"
        else
            xdg-open "$i" >/dev/null 2>/dev/null &
        fi
    done
}

これは、プログラムがターミナルを必要とするかどうかを確認し、必要な場合はフォアグラウンドで呼び出します。そうでない場合はバックグラウンドで呼び出します。ただし、これは現在 URL やカスタム アプリケーションを処理しないため、システムで処理できるように適切に編集する必要があります。それでも、これは構築できる出発点です。

関連情報