간단히 말해서:

간단히 말해서:

간단히 말해서:

데비안에서는 xdg-open(경유 xdg-mime) 내가 선호하는 사양을 따르지 않습니다 mailcap.run-mailcapxdg-open항목을 추적 하는 체계적인 방법이 있습니까 mailcap?xdg-open항상 호출하도록 스크립트를 수정하는 것보다 이상적으로 더 간단합니다 run-mailcap.

문맥

Debian(9.5stretch 기준)에는 기본 응용 프로그램을 설정하거나 더 구체적으로 파일 확장자, MIME 유형 및 프로그램(또는 프로그램 작업)을 연결하는 여러 시스템이 있습니다. 그들에 대한 간략한 리뷰이 답변에서. MIME 연관 측면에서 가장 세분화된 두 가지 주요 항목은 다음과 같습니다.

  1. 데스크탑 환경을 위한 "보다 현대적인" XDG 표준
  2. 이전 mailcap시스템은 메일 프록시 및 터미널 환경을 더 대상으로 했습니다(또는 데스크톱과는 아무 관련이 없었습니다). 매우 잘 설명됨이 답변에서.

표적

저는 두 번째 mailcap 시스템을 선호합니다. 그 이유는 와일드카드 mailcap.order접근 방식을 사용하면 애플리케이션을 지원하는 모든 MIME 유형(또는 하위 집합)과 자동으로 연결하는 것이 매우 편리하고 특정 MIME 유형의 뷰어와 편집자를 구별할 수도 있기 때문입니다. 또한 시스템은 시스템 업데이트와 긴밀하게 통합되어 있습니다. 즉, 패키지를 업데이트해도 연결 순서가 변경되지 않습니다.

실행 진입점

위에서 언급한 두 가지 방법에는 서로 다른 진입점이 있습니다.

  1. XDG 사용xdg-open
  2. mailcap 시스템 사용법 run-mailcap또는 별칭( view, edit)

그러나 프로그램마다 서로 다른 진입점을 호출하므로 결과가 일관되지 않을 수 있습니다. 그래도 나는 그 일을 하고 있어요.

xdg-open으로 반환될 수 있습니다.run-mailcap

/usr/bin/xdg-open검사 결과 데스크톱이 활성화된 경우(매우 일반적인 의미에서 반드시 데스크톱 환경일 필요는 없음) 사용을 시도하고, 그렇지 않으면 사용 가능한 것으로 대체될 수 있는 것으로 보입니다 .xdg-utils-1.1.1-1+deb9u1xdg-openxdg-mimerun-mailcap

# ... line 787 in /usr/bin/xdg-open
open_generic()
{
    if is_file_url_or_path "$1"; then
        local file="$(file_url_to_path "$1")"

        check_input_file "$file"

        if [ -n "$DISPLAY" ]; then
            filetype=`xdg-mime query filetype "$file" | sed "s/;.*//"`
            open_generic_xdg_mime "$file" "$filetype"
        fi

        if which run-mailcap 2>/dev/null 1>&2; then
            run-mailcap --action=view "$file"
            if [ $? -eq 0 ]; then
                exit_success
            fi
        fi
# ...

불일치의 구체적인 예

목표는 Evince를 PDF, Djvu 등의 기본 뷰어로 만드는 것입니다.

항목을 실행 evince:*/*한 후 /etc/mailcap.order(아마도 패키지를 업데이트한 후 자동으로) update-mime해당 항목이 application/pdf; evince %s; test=test -n "$DISPLAY"먼저 표시됩니다 /etc/mailcap. 따라서 런처는 run-mailcap원하는 대로 Evince를 사용할 수 있습니다.

그러나 무언가를 사용하면 xdg-openLibreoffice Draw에서 PDF가 열립니다. 그 이유는 다음과 같습니다( set -x스크립트에 삽입하여 결정됨).

  1. xdg-openxdg-mime query filetype file.pdfMIME 유형이 누구인지 확인하기 위해 호출됩니다 .application/pdf
  2. xdg-mime그런 다음 해당 MIME 유형에 대한 기본 응용 프로그램이 있는지 쿼리합니다 .
  3. 실제 연결이 없으므로 *.dekstop해당 MIME 유형을 지원하는 항목을 찾기 시작합니다. 각 *.desktop파일에 대해 이 필드를 살펴보고 InitialPreference적합한 후보를 결정합니다.
  4. 사용 libreoffice-draw.desktop하게 되는 경우가 있습니다 .initialPreference=5

디버그 정보가 포함된 자세한 로그는 다음과 같습니다 xdg-mime query default call.

$ XDG_UTILS_DEBUG_LEVEL=3 xdg-mime query default application/pdf              
Checking /home/$USER/.config/mimeapps.list
Checking /etc/xdg/mimeapps.list
Checking /home/$USER/.local/share/applications/mimeapps.list
Checking /usr/share//applications/mimeapps.list
Checking /home/$USER/.local/share/applications/defaults.list and 
        /home/$USER/.local/share/applications/mimeinfo.cache
Checking /home/$USER/.local/share/applications/defaults.list and 
         /home/$USER/.local/share/applications/mimeinfo.cache
Checking /usr/local/share//applications/defaults.list and 
         /usr/local/share//applications/mimeinfo.cache
Checking /usr/local/share//applications/defaults.list and 
/usr/local/share//applications/mimeinfo.cache
Checking /usr/share//applications/defaults.list and 
         /usr/share//applications/mimeinfo.cache
Checking /usr/share//applications/defaults.list and 
         /usr/share//applications/mimeinfo.cache
 Checking /home/$USER/.local/share/applications/wine-extension-pdf.desktop
   Select /home/$USER/.local/share/applications/wine-extension-pdf.desktop 
           [ -1 => 0 ]
 Checking /usr/share//applications/FoxitReader.desktop
 Checking /usr/share//applications/evince.desktop
 Checking /usr/share//applications/gimp.desktop
 Checking /usr/share//applications/inkscape.desktop
 Checking /usr/share//applications/libreoffice-draw.desktop
   Select /usr/share//applications/libreoffice-draw.desktop [ 0 => 05 ]
 Checking /usr/share//applications/mcomix.desktop
 Checking /usr/share//applications/mupdf.desktop
 Checking /usr/share//applications/pdf-presenter-console.desktop
 Checking /usr/share//applications/vprerex.desktop
 Checking /usr/share//applications/xpdf.desktop
 Checking /usr/share//applications/zathura-pdf-poppler.desktop
 libreoffice-draw.desktop

의 숫자는 [ X => ]이와 같은 호출을 통해 얻어지며 이를 awk -F= /InitialPreference=/ {print($2)} /usr/share//applications/libreoffice-draw.desktop스크립트에 넣어서 결정했습니다 .set -xxdg-mime

지금까지 제안된 해결 방법

지금까지 제가 생각한 해결책은 다음과 같습니다.저는 더 좋고 이상적으로는 더 체계적인 솔루션을 찾고 있습니다.

  • 한 가지 옵션은 xdg-open항상 run-mailcap. 내가 사용한다고 해도 dpkg-divert그것은 여전히 ​​내가 직접 관리해야 한다는 것을 의미한다.

  • XDG 시스템을 사용하고 이와 같은 */*:xdg-open것을 mailcap.

답변1

xdg-open또한 다양한 제한 사항으로 인해 종종 혼란스러워 합니다 .

여기서는 완전한 척은 아니지만 다음 데스크톱 항목을 사용하고 있습니다.

[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
NoDisplay=true
Exec=run-mailcap %u
Name=run-mailcap
Comment=run-mailcap

모든 것을 나에게 위임하세요 mimeapps.list.

[Default Applications]
application/ogg=run-mailcap.desktop
application/pdf=run-mailcap.desktop
application/postscript=run-mailcap.desktop
application/rar=run-mailcap.desktop
application/rss+xml=run-mailcap.desktop
application/vnd.openxmlformats-officedocument.wordprocessingml.document=run-mailcap.desktop
application/x-cue=run-mailcap.desktop
application/x-extension-eml=run-mailcap.desktop
application/x-extension-htm=run-mailcap.desktop
application/x-extension-html=run-mailcap.desktop
application/x-extension-rss=run-mailcap.desktop
application/x-extension-xhtml=run-mailcap.desktop
application/x-ms-dos-executable=run-mailcap.desktop
application/x-xpinstall=run-mailcap.desktop
application/xhtml+xml=run-mailcap.desktop
application/xml=run-mailcap.desktop
application/xspf+xml=run-mailcap.desktop
application/zip=run-mailcap.desktop
audio/midi=run-mailcap.desktop
audio/prs.sid=run-mailcap.desktop
...

이론적으로 이 및/또는 사용자 지정 전송은 xdg-open가상 xdg-utils구현으로 변환될 수 있습니다.

관련 정보