백그라운드에서 프로그램을 시작할 때 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이나 사용자 정의 애플리케이션을 처리하지 않으며 이를 처리하려면 시스템에 맞게 편집해야 합니다. 그럼에도 불구하고 이는 여러분이 구축할 수 있는 출발점입니다.

관련 정보