debian 9 上的 xdg-open 无法打开浏览器

debian 9 上的 xdg-open 无法打开浏览器

我决定尝试 lxdm(使用 Fluxbox 和 xfce),并发现对于许多程序来说,url 处理程序失败,产生此错误消息; 错误信息

正如您所看到的,这很奇怪,它将用户目录添加到 url 前面。这里的例子来自 telegram,但它发生在不和谐的情况下,以及从命令行执行时;xdg-open https://www.google.com产生类似的错误。 xdg-settings get default-web-browser输出的 firefox.desktop 可以作为 xfce 和 lxdm 中的链接。更多信息;我在上面运行了 bash -x 然后...

$ bash -x /usr/bin/xdg-open http://www.google.com
+ check_common_commands http://www.google.com
+ '[' 1 -gt 0 ']'
+ parm=http://www.google.com
+ shift
+ case "$parm" in
+ '[' 0 -gt 0 ']'
+ '[' -z '' ']'
+ unset XDG_UTILS_DEBUG_LEVEL
+ '[' 0 -lt 1 ']'
+ xdg_redirect_output=' > /dev/null 2> /dev/null'
+ '[' xhttp://www.google.com '!=' x ']'
+ url=
+ '[' 1 -gt 0 ']'
+ parm=http://www.google.com
+ shift
+ case "$parm" in
+ '[' -n '' ']'
+ url=http://www.google.com
+ '[' 0 -gt 0 ']'
+ '[' -z http://www.google.com ']'
+ detectDE
+ unset GREP_OPTIONS
+ '[' -n LXDE ']'
+ case "${XDG_CURRENT_DESKTOP}" in
+ DE=lxde
+ '[' xlxde = x ']'
+ '[' xlxde = x ']'
+ '[' xlxde = x ']'
+ '[' xlxde = xgnome ']'
+ '[' -f /run/user/1000/flatpak-info ']'
+ '[' xlxde = x ']'
+ DEBUG 2 'Selected DE lxde'
+ '[' -z '' ']'
+ return 0
+ case "${BROWSER}" in
+ case "$DE" in
+ open_lxde http://www.google.com
+ pcmanfm --help -a is_file_url_or_path http://www.google.com
++ file_url_to_path http://www.google.com
++ local file=http://www.google.com
++ echo http://www.google.com
++ grep -q '^file:///'
++ echo http://www.google.com
+ local file=http://www.google.com
+ echo http://www.google.com
+ grep -q '^/'
++ pwd
+ file=/home/nesmerrill/.local/share/applications/http://www.google.com
+ pcmanfm /home/nesmerrill/.local/share/applications/http://www.google.com
+ '[' 0 -eq 0 ']'
+ exit_success
+ '[' 0 -gt 0 ']'
+ exit 0

重要的部分似乎是pcmanfm --help -a is_file_url_or_path http://www.google.com,但是,如果该命令是这样使用的,似乎没有做任何事情?

$ pcmanfm --help -a is_file_url_or_path http://www.google.com
Usage:
  pcmanfm [OPTION…] [FILE1, FILE2,...]  

Help Options:
  -h, --help                   Show help options
  --help-all                   Show all help options
  --help-gtk                   Show GTK+ Options

Application Options:
  -p, --profile=PROFILE        Name of configuration profile
  -d, --daemon-mode            Run PCManFM as a daemon
  --no-desktop                 No function. Just to be compatible with nautilus
  --desktop                    Launch desktop manager
  --desktop-off                Turn off desktop manager if it's running
  --desktop-pref               Open desktop preference dialog
  --one-screen                 Use --desktop option only for one screen
  -w, --set-wallpaper=FILE     Set desktop wallpaper from image FILE
  --wallpaper-mode=MODE        Set mode of desktop wallpaper. MODE=(color|stretch|fit|crop|center|tile|screen)
  --show-pref=N                Open Preferences dialog on the page N
  -n, --new-win                Open new window
  -f, --find-files             Open a Find Files window
  --role=ROLE                  Window role for usage by window manager
  --display=DISPLAY            X display to use

答案1

@user310685 已经接近了 - 但绝对是错误的。该修复仅在以下情况下“有效xdg-open不是给定“裸”文件路径(即没有前导“file://”URI 方案和双斜杠)或文件方案 URI(即带有前导“file://”)。这两种类型的论证应该xdg-open遵循pcmanfm,但他们不会。

实际的错误不是 STDERR 重定向中的错误。相反,脚本编写者混淆了test“and”运算符和 shell 的进程列表“and”连接器。 (错误地)使用的是“-a”;正确的是“&&”。

作为参考,我复制了原始脚本行、我对该行的修复以及@user310685 的“恐怖中的恐怖”建议:

#ORIG#   if pcmanfm --help >/dev/null 2>&1 -a is_file_url_or_path "$1"; then
#FIXED#  if pcmanfm --help >/dev/null 2>&1 && is_file_url_or_path "$1"; then
#HORROR# if pcmanfm --help >/dev/null 2>$1 -a is_file_url_or_path "$1"; then

其意图if ..; then在其上方的脚本行中给出:

# pcmanfm only knows how to handle file:// urls and filepaths, it seems.

考虑到这个评论,理解有问题的if .. then行的方法是:

  1. 测试是否pcmanfm可运行(通过让它报告自己的帮助,并丢弃任何 STDOUT 或 STDERR)
  2. 并且,运行脚本函数is_file_url_or_path()以查看"$1"参数是否可接受pcmanfm(根据上面提到的代码注释)

如果这两个条件都成立,则脚本将流入一个短块:

  1. 调用脚本函数file_url_to_path()来去掉任何前导的“file://”部分(作为本地 var file
  2. 如果结果不是绝对路径(即不以“/”开头),则将 CWD 添加到以下值file
  3. 执行pcmanfm "$file"

为什么原始脚本失败:

如上所述,该脚本(错误地)使用“-a”作为“进程列表”实际发生的情况是 shell 运行命令(在 STDOUT 和 STDERR 重定向被“拉出”命令之后,它们允许出现在命令字序列中第一个单词之后的任何位置):

pcmanfm --help -a is_file_url_or_path "$1"

总是成功(除非pcmanfm在 PATH 上不可执行)。通过运行它的模式,命令行 ( ) 上的所有额外内容-a ..都会被忽略。因此,“作为文件或文件 URL 进行处理”代码块是pcmanfm--help总是被执行。当给定 URL(带有方案部分)时,file_url_to_path()脚本函数仅删除前导“file://”,截断任何尾随“#...”片段,并对参数进行 URI 解码(即“%XX”)转换为 ASCII)。注意:除非参数以“file:///”开头,否则不会执行任何操作。

例如,OP 的 URL“https://www.google.com" 不变,file_url_to_path()因为它不以“file:///”开头。后面的代码会将此参数视为“相对路径”,因为它显然不是以“/”开头。因此,它如所描述的那样预先考虑 CWD,然后pcmanfm几乎肯定不会找到该 munged 值作为要显示的现有路径。相反,它显示一个错误弹出窗口,如OP的问题所示。

修复:

足够简单:对流程链使用正确的 AND 运算符语法:“&&”,如上面#FIXED#的行所示。

@user310685 的建议的可怕之处:

@user310685 的提议确实解决了一个问题。发生的情况是 shell 尽职尽责地进行变量扩展,然后尝试执行类似以下内容:

pcmanfm --help >/dev/null 2>https://www.google.com -a is_file_url_or_path https://www.google.com

这几乎肯定会产生 shell 重定向错误(除非 CWD 有一个名为“https:”的文件夹(在正确的位置) - 它可以)。该重定向错误会向 STDERR 发送一条消息,然后 shell 继续运行。由于此错误发生在if .. else .. fi块内,因此 shell 会占用该else .. fi部分,这正是 @user310685 想要的。这样,问题就解决了……

但代价是什么?

这个不太正确的修复有两个问题:

  1. 当实际给出路径或文件架构 URL 时,会执行错误的代码路径(else .. fi部分)。这是因为预期的进程链实际上只是一个(几乎)总是生成 shell 重定向错误的进程,该错误被视为if .. ;“假”的条件。这不苏奥不好,因为该else .. fi块只是将工作推迟到另一个名为的脚本函数,open_generic()该函数旨在处理路径和文件 URL(但不用于pcmanfm完成工作,而是使用其他一些复杂的代码路径,我没有分析,但我认为确实如此)一份公平的工作)。可是等等!这恐怖...
  2. 回头看看pcmanfm --help ...shell 尝试的扩展脚本行。请注意 STDERR 的重定向。考虑一下如果使用合法路径(例如“/home/user/precious”)完成此操作会发生什么。我的天啊尝试探测是否pcmanfm可用,然后测试参数是否是一个文件覆盖文件!!!再见了,珍贵的...

答案2

这对于Debian 10 (buster)LXDE也是xdg-utils 1.1.3-1。脚本中有一个错字xdg-open,解决方法如下:

    --- /usr/bin/xdg-open   2018-05-20 00:18:48.000000000 +0200
+++ /home/klaumi/bin/xdg-open   2018-09-13 15:15:51.630704599 +0200
@@ -928,7 +928,7 @@
 {

     # pcmanfm only knows how to handle file:// urls and filepaths, it seems.
-    if pcmanfm --help >/dev/null 2>&1 -a is_file_url_or_path "$1"; then
+    if pcmanfm --help >/dev/null 2>$1 -a is_file_url_or_path "$1"; then
         local file="$(file_url_to_path "$1")"

         # handle relative paths

(注意,&in2>&1必须替换为$

答案3

已确认适用于 Debian 10 (buster)、LXDE、xdg-utils 1.1.3-1。看起来像一个错误?一种不需要编辑的选项/usr/bin/xdg-open

  • 您可以要求 xdg-open 使用不同的桌面环境的处理程序(参考1): XDG_CURRENT_DESKTOP=gnome xdg-open https://www.google.com

答案4

Seiji Adachi 的修复(他称之为临时修复)对我来说效果很好https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=906766

相关内容