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이나 사용자 정의 애플리케이션을 처리하지 않으므로 시스템이 이러한 문제를 처리할 수 있도록 적절하게 편집해야 합니다. 하지만 이는 계속해서 발전할 수 있는 출발점입니다.

관련 정보