간단히 말해서:
데비안에서는 xdg-open
(경유 xdg-mime
) 내가 선호하는 사양을 따르지 않습니다 mailcap
.run-mailcap
xdg-open
항목을 추적 하는 체계적인 방법이 있습니까 mailcap
?xdg-open
항상 호출하도록 스크립트를 수정하는 것보다 이상적으로 더 간단합니다 run-mailcap
.
문맥
Debian(9.5stretch 기준)에는 기본 응용 프로그램을 설정하거나 더 구체적으로 파일 확장자, MIME 유형 및 프로그램(또는 프로그램 작업)을 연결하는 여러 시스템이 있습니다. 그들에 대한 간략한 리뷰이 답변에서. MIME 연관 측면에서 가장 세분화된 두 가지 주요 항목은 다음과 같습니다.
- 데스크탑 환경을 위한 "보다 현대적인" XDG 표준
- 이전
mailcap
시스템은 메일 프록시 및 터미널 환경을 더 대상으로 했습니다(또는 데스크톱과는 아무 관련이 없었습니다). 매우 잘 설명됨이 답변에서.
표적
저는 두 번째 mailcap 시스템을 선호합니다. 그 이유는 와일드카드 mailcap.order
접근 방식을 사용하면 애플리케이션을 지원하는 모든 MIME 유형(또는 하위 집합)과 자동으로 연결하는 것이 매우 편리하고 특정 MIME 유형의 뷰어와 편집자를 구별할 수도 있기 때문입니다. 또한 시스템은 시스템 업데이트와 긴밀하게 통합되어 있습니다. 즉, 패키지를 업데이트해도 연결 순서가 변경되지 않습니다.
실행 진입점
위에서 언급한 두 가지 방법에는 서로 다른 진입점이 있습니다.
- XDG 사용
xdg-open
- mailcap 시스템 사용법
run-mailcap
또는 별칭(view
,edit
)
그러나 프로그램마다 서로 다른 진입점을 호출하므로 결과가 일관되지 않을 수 있습니다. 그래도 나는 그 일을 하고 있어요.
xdg-open
으로 반환될 수 있습니다.run-mailcap
/usr/bin/xdg-open
검사 결과 데스크톱이 활성화된 경우(매우 일반적인 의미에서 반드시 데스크톱 환경일 필요는 없음) 사용을 시도하고, 그렇지 않으면 사용 가능한 것으로 대체될 수 있는 것으로 보입니다 .xdg-utils-1.1.1-1+deb9u1
xdg-open
xdg-mime
run-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-open
Libreoffice Draw에서 PDF가 열립니다. 그 이유는 다음과 같습니다( set -x
스크립트에 삽입하여 결정됨).
xdg-open
xdg-mime query filetype file.pdf
MIME 유형이 누구인지 확인하기 위해 호출됩니다 .application/pdf
xdg-mime
그런 다음 해당 MIME 유형에 대한 기본 응용 프로그램이 있는지 쿼리합니다 .- 실제 연결이 없으므로
*.dekstop
해당 MIME 유형을 지원하는 항목을 찾기 시작합니다. 각*.desktop
파일에 대해 이 필드를 살펴보고InitialPreference
적합한 후보를 결정합니다. - 사용
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 -x
xdg-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
구현으로 변환될 수 있습니다.