xdg-open がバックグラウンドでプログラムを起動すると例外が発生します。

xdg-open がバックグラウンドでプログラムを起動すると例外が発生します。

これまで、xdg-openにエイリアスを使用してきました。

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

xdg-open のデフォルト動作は、現在選択されている端末のフォアグラウンドでプロセスを開始することです。したがって、xdg-mimeを介してvimに関連するファイルを開くと、コマンドが入力された端末でエディタが開きます。

問題は、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やカスタムアプリケーションを処理していないため、システムがこれらの問題を処理できるように適切に編集する必要があります。しかし、これは引き続き発展できる出発点です。

関連情報