xdg-open 自 16.04 升级后停止工作

xdg-open 自 16.04 升级后停止工作
xdg-mime query default inode/directory

正确地给了我:

nemo.desktop

正如我所期望的,并且希望如此。

xdg-open $HOME

给出错误:

xdg-mime: mimetype argument missing
Try 'xdg-mime --help' for more information.
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/%{ <-- HERE (.*?)}/ at /usr/bin/run-mailcap line 528.
Warning: program returned non-zero exit code #66

...并打开 Audacious。

我尝试编辑 run-mailcap 行以转义括号,这样可以消除该错误消息。但这并不能解决问题。我仍然收到“缺少 mimetype 参数”的消息,并且打开了错误的程序。

我尝试卸载 Audacious,但它却打开了另一个错误的程序(git-cola 和 chrome)。

我尝试过sudo apt-get install --reinstall xdg-utils但什么也没改变。

编辑:更多信息,上述行为在 Cinnamon 和 Gnome 中都会发生,但在 Lubuntu LXDE 中不会发生。在 LXDE 中,查询给出 nemo.desktop,并且 xdg-open 不会在终端中产生任何错误消息,但它会打开 PCManFM(而不是 nemo)。

这是否可以作为错误发生或解决方法的线索?

答案1

我遇到了完全相同的问题。我只需安装(仅此而已)
即可解决问题...gvfs-bin

sudo apt install gvfs-bin

我发现了这一点,因为在用户的日志文件中阿米亚斯内容如下:
gvfs-open /home/amias

但是我的系统上没有安装 gvfs-open。

安装后gvfs-bin,就可以工作了!

要设置新的文件关联(例如使用 Nemo 关联文件夹),您可以执行以下操作:

gvfs-mime --set inode/directory nemo.desktop

-干杯

答案2

好的,从这篇文章来看,似乎已经为遇到类似问题的人发布了一个补丁: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=810587

在本文中,该人遇到了:

“正则表达式中未转义的左括号已被弃用,在正则表达式中传递;在 /usr/bin/run-mailcap 第 528 行的 m/%{ <-- HERE (.*?)}/ 中用 <-- HERE 标记。”

运行 nmh 时,它看起来与您的错误消息类似,只是程序不同。因此,我建议运行:

sudo apt-get upgrade;sudo apt-get dist-upgrade

因为受影响的软件包可能有可随补丁提供的升级版本。

我希望这有帮助。

注意:这将升级所有可以升级的软件包(无论如何这都是一件好事),所以如果有多个软件包想要升级,请不要感到惊讶。

答案3

xdg-open 是一个 shell 脚本,因此您可以使用 -x 对其进行调试。

bash -x /usr/bin/xdg-open $HOME

这给了我这样的输出

+ check_common_commands /home/amias
+ '[' 1 -gt 0 ']'
+ parm=/home/amias
+ shift
+ case "$parm" in
+ '[' 0 -gt 0 ']'
+ '[' -z '' ']'
+ unset XDG_UTILS_DEBUG_LEVEL
+ '[' 0 -lt 1 ']'
+ xdg_redirect_output=' > /dev/null 2> /dev/null'
+ '[' x/home/amias '!=' x ']'
+ url=
+ '[' 1 -gt 0 ']'
+ parm=/home/amias
+ shift
+ case "$parm" in
+ '[' -n '' ']'
+ url=/home/amias
+ '[' 0 -gt 0 ']'
+ '[' -z /home/amias ']'
+ detectDE
+ unset GREP_OPTIONS
+ '[' -n Unity ']'
+ case "${XDG_CURRENT_DESKTOP}" in
+ '[' x = x ']'
+ '[' x '!=' x ']'
+ '[' xthis-is-deprecated '!=' x ']'
+ DE=gnome
+ '[' xgnome = x ']'
+ '[' xgnome = x ']'
+ '[' xgnome = xgnome ']'
+ which gnome-default-applications-properties
+ DE=gnome3
+ '[' xgnome3 = x ']'
+ DEBUG 2 'Selected DE gnome3'
+ '[' -z '' ']'
+ return 0
+ case "${BROWSER}" in
+ case "$DE" in
+ open_gnome3 /home/amias
+ gvfs-open --help
+ gvfs-open /home/amias
+ '[' 0 -eq 0 ']'
+ exit_success
+ '[' 0 -gt 0 ']'
+ exit 0

这是来自 64 位 16.04 上的 xdg-open 的工作安装。

我已经向你展示了我的,现在你向我展示你的。

编辑:

查看您的输出,我可以看到 open_generic_xdg_mime 无法返回 mime 类型,这导致脚本无法选择正确的服务。一个简单的解决方法是创建一个名为 open_generic_xdg_mime 的脚本,并让其针对其输入运行“file -i”,这将为您提供 mime 类型,但您需要使用 cut 之类的方法稍微整理一下输出。如果您需要帮助,请告诉我。

答案4

问题在于gvfs-info已被弃用而造成的。

635 号线xdg-mime用于gvfs-infognome。 bash gvfs-info "$1" 2> /dev/null | grep standard::content-type | cut -d' ' -f4

我尝试手动重新评估该行,结果如下:

gvfs-info ~/test.pdf|grep standard::content-type| cut -d' ' -f4
This tool has been deprecated, use 'gio info' instead.
See 'gio help info' for more info.

/usr/bin/gvfs-info: 10: [: ~/test.pdf: unexpected operator
/usr/bin/gvfs-info: 10: [: ~/test.pdf: unexpected operator
application/pdf

然后我尝试使用gio info

gio info ~/test.pdf|grep standard::content-type| cut -d' ' -f4
application/pdf

所以我暂时改变了信息_gnome()xdg-mime用它来gio info代替,然后,它就起作用了!

631 info_gnome()                                                                     
632 {                                                                                
633     if gvfs-info --help 2>/dev/null 1>&2; then                                   
634         DEBUG 1 "Running gvfs-info \"$1\""                                       
635         gnomevfs-info "$1" 2> /dev/null | grep standard::content-type | cut -d' ' -f4 
636     elif gnomevfs-info --help 2>/dev/null 1>&2; then                             
637         DEBUG 1 "Running gnomevfs-info \"$1\""                                   
638         gnomevfs-info --slow-mime "$1" 2> /dev/null | grep "^MIME" | cut -d ":" -f 2 | sed s/"^ "//
639     else                                                                         
640         DEBUG 1 "Running gio info \"$1\""                                        
641         gio info "$1" 2> /dev/null | grep standard::content-type | cut -d' ' -f4 
642     fi                                                                           
643     if [ $? -eq 0 ]; then                                                        
644         exit_success                                                             
645     else                                                                         
646         exit_failure_operation_failed                                            
647     fi                                                                           
648 }

相关内容