AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 450200
Accepted
Evil Spork
Evil Spork
Asked: 2018-06-17 11:37:50 +0800 CST2018-06-17 11:37:50 +0800 CST 2018-06-17 11:37:50 +0800 CST

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

  • 772

我决定尝试 lxdm(使用的是fluxbox和xfce),并发现对于许多程序,url处理程序都失败了,产生了这个错误消息; 错误信息

如您所见,这很奇怪,它将用户目录添加到 url。这里的例子来自电报,但它发生在不和谐,以及从命令行执行时;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
debian url
  • 4 4 个回答
  • 6074 Views

4 个回答

  • Voted
  1. Best Answer
    Stevel
    2019-08-26T21:41:09+08:002019-08-26T21:41:09+08:00

    @user310685 接近了 - 但绝对是错误的。只有在没有给出“裸”文件路径(即没有前导“file://”URI 方案和双斜杠)或文件方案 URI(即带有前导“file://”)时xdg-open,该修复“才有效” . 这两种类型的论点应该有defer to ,但他们不会。xdg-openpcmanfm

    实际错误不是 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”代码块总是被执行。当给定一个 URL(带有方案部分)时,脚本函数仅删除前导“file://”,截断任何尾随“#...”片段,并且还对参数进行 URI 解码(即“%XX”转换为 ASCII)。注意:除非参数以“file:///”开头,否则什么都不做。pcmanfm--helpfile_url_to_path()

    例如,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”)完成此操作会发生什么。OMG尝试探测是否pcmanfm可用,然后测试参数是否是文件,只是覆盖文件!!!再见了珍贵...
    • 11
  2. user310685
    2018-09-14T05:31:30+08:002018-09-14T05:31:30+08:00

    这对于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必须替换为$)

    • 2
  3. helmingstay
    2018-08-22T18:33:02+08:002018-08-22T18:33:02+08:00

    确认适用于 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

    • 1
  4. user149244
    2019-12-12T22:41:50+08:002019-12-12T22:41:50+08:00

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

    • 0

相关问题

  • GRUB 配置以识别同一 Linux 发行版的不同桌面环境(安装)

  • astyle 不会更改源文件格式

  • 接收有关全新 Debian 的电子邮件

  • Debian Stretch:libgs_plugin_systemd-updates.so 中的 gnome-software 段错误

  • 如何在拼音输入法中输入ü?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve