Ven*_*lli 5 command-line scheme
我在 RedHat Linux 上创建了自定义 URI 方案处理程序,它按预期工作。例如,当用户被重定向到自定义 URI 时:myapp://abcd浏览器打开类似于 mailto: handler 的应用程序启动器弹出窗口。
在 Ubuntu 中执行类似的步骤并不容易,我尝试了所有可能的解决方案,但都没有奏效。
这是我为 RedHat 所做的工作,它完美地工作:
在 中添加条目~/.local/share/applications/mimeapps.list:
[Added Associations]
x-scheme-handler/myprotocol=myprotocol-handler.desktop
Run Code Online (Sandbox Code Playgroud)添加 myprotocol-handler.desktop 在~/.local/share/applications/myprotocol-handler.desktop:
[Desktop Entry]
Version=1.0
Type=Application
Exec=sh -c "$HOME/.my-handler.sh %u"
Icon=
StartupNotify=true
Terminal=false
Categories=Utility;X-XFCE;X-Xfce-Toplevel;
MimeType=x-scheme-handler/myprotocol
Name=My Launcher
Comment=Launch MyProtocol
Run Code Online (Sandbox Code Playgroud)创建~/.my-handler.sh:
[Added Associations]
x-scheme-handler/myprotocol=myprotocol-handler.desktop
Run Code Online (Sandbox Code Playgroud)我已经在 Ubuntu 上尝试了上述步骤,但它不起作用,方案处理程序仅适用于xdg-open命令,如果我在浏览器上尝试相同的 URI,则它不起作用。
我尝试了以下位置:
~/.config/
~/.local/share/applications/
~/.local/share/applications/packages
sudo update-desktop-database
xdg-mime command
Run Code Online (Sandbox Code Playgroud)
没有一种方法按预期工作。有人能指出我正确的方向吗,我的 Ubuntu 版本是16.04.4
\n\n\n我已经在 Ubuntu 上尝试了上述步骤,但不起作用
\n
如果我不得不猜测,我会说你的桌面文件可能无法执行。
\n\n$ if test -x ~/.local/share/applications/myprotocol-handler.desktop; then echo \'executable\'; else echo \'not executable\'; fi\nRun Code Online (Sandbox Code Playgroud)\n\n你可以像这样解决这个问题:
\n\n$ chmod +x ~/.local/share/applications/myprotocol-handler.desktop\nRun Code Online (Sandbox Code Playgroud)\n\n首先尝试一下。
\n\n此外,我还可以立即看到其他一些问题:
\n\n您是注册myapp计划还是myprotocol计划?
您提到了这两个内容,但您想要打开的 URL 确实有些令人困惑。
\n\n我假设您想使用该myprotocol方案,\ne.g。myprotocol://abcd。
桌面文件的“Exec”条目。
\n\nExec=sh -c "$HOME/.my-handler.sh %u"\nRun Code Online (Sandbox Code Playgroud)\n\n如果$HOME/在.my-handler.sh您的$PATH.
如果您的脚本是可执行的,则sh -c没有必要,\n因为它的顶部有 shebang 行。\n这还增加了另一层复杂性,\n因为任何 URL 在到达您的 URL 处理程序脚本之前都将被 shell 扩展\n。
shebang 行将其列为 bash 脚本 ( #!/bin/bash),\n但您正在使用sh它来执行它。\n我没有看到脚本的任何部分会产生影响,\n但默认情况下sh,dash\n不同外壳来自bash.
$ type -a sh\nsh is /bin/sh\n$ file /bin/sh\n/bin/sh: symbolic link to dash\nRun Code Online (Sandbox Code Playgroud)剧本.my-handler.sh。
您不需要将其设置为隐藏文件;\n 这样的文件名my-handler.sh就可以了。\n因为我怀疑您的主目录位于 中$PATH,\n将它放在您的主目录中没有任何优势,除了使绝对路径短一点。\n(请参阅$PATH下面的更多信息。)
你的 shebang 将在 Ubuntu 上运行:
\n\n$ type -a bash\nbash is /bin/bash\nRun Code Online (Sandbox Code Playgroud)\n\n但为了可移植性,这是一个好习惯#!/usr/bin/env bash。
您正在使用未初始化的变量“$code”\n并将其附加到名为 的文件中file。\n这样做的目的是什么?\n由于file是相对路径,\n这将取决于工作目录,\n这可能不是您想要的\n(对于从 Firefox 启动的 URL,\n这将取决于浏览器启动的目录,\n可能是主目录,但也可能是几乎任何其他目录。)
您的脚本从不使用"$1"或任何其他参数。\n这意味着它本质上是丢弃所传递的 URL\n并打开https://redirect.site.com。
但也许这只是一个占位符脚本,这是故意的?\n如果是这样,我会建议使用这个测试脚本:
\n\n$ cat .my-handler.sh\n#! /usr/bin/env bash\nURL="$1"\nzenity --info --text "URL: ${URL}\\nPWD=${PWD}"\nRun Code Online (Sandbox Code Playgroud)\n\n这样您就可以看到传递的 URL 以及运行它的目录。
\n\n\n方案处理程序仅适用于
\nxdg-open命令,如果我在浏览器上尝试相同的 URI,则它不起作用。
如果xdg-open有效,那么只需配置浏览器即可。\n根据您的评论,您似乎使用的是 Firefox,\n它在“首选项”下处理此问题:
\n\n\n应用领域
\n\n选择 Firefox 如何处理您从网络下载的文件或\n 浏览时使用的应用程序。
\n
handlers.json正如您提到的,它存储在 中。
\n\n\n我尝试了以下位置
\n
如果xdg-open已经可以工作,\n这应该不是问题,\n但是关于自定义 URL 处理程序的一个棘手的问题\n是,至少有四个文件可能存储关联,\n具体取决于应用程序使用的应用程序/库:
~/.config/mimeapps.list(修改正确的地方)~/.local/share/application/mimeapps.list(已弃用的位置)~/.local/share/applications/mimeinfo.cache(已弃用位置的缓存)~/.local/share/application/defaults.list(较旧的已弃用位置)我们将在下面解决这个问题。
\n\n我最近在自定义 URL 处理程序方面做了一些工作,因此我为此目的调整了其中的一些工作。下面是一些可能对您有所帮助的分步说明:
\n\n检查协议是否已注册。
\n\n$ gio mime x-scheme-handler/myprotocol\nNo default applications for \xe2\x80\x9cx-scheme-handler/myprotocol\xe2\x80\x9d\nRun Code Online (Sandbox Code Playgroud)\n\n就我而言,该协议尚未注册。
直接测试脚本。
\n\n您可能需要使其可执行,如下所示:
\n\n$ chmod +x ~/.my-handler.sh\nRun Code Online (Sandbox Code Playgroud)\n\n然后使用示例 URL:
\n\n$ ~/.my-handler.sh \'myprotocol://abcd\'\nRun Code Online (Sandbox Code Playgroud)\n\n在继续之前先解决此处的任何问题。
将脚本添加到您的脚本中$PATH,以便桌面文件可以找到它。
此步骤是可选的,\n但这是一个值得养成的好习惯。\n将脚本放入$PATH\n意味着您不必在桌面文件中包含完整的绝对路径,\n因此您的桌面文件将不需要更改\n如果脚本的路径发生变化。
我使用bin这样的目录:
$ mkdir ~/bin/\nRun Code Online (Sandbox Code Playgroud)\n\n并将其添加到~/.profile\n(请注意,您需要注销并再次登录才能看到更改):
PATH="$HOME/bin:$PATH"\nRun Code Online (Sandbox Code Playgroud)\n\n最后将脚本复制或符号链接到~/bin:
$ ln -s $PWD/.my-handler.sh ~/bin/\nRun Code Online (Sandbox Code Playgroud)\n\n如果你做得正确,你应该做类似这样的事情:
\n\n$ type -a .my-handler.sh\n.my-handler.sh is /home/nathaniel/bin/.my-handler.sh\nRun Code Online (Sandbox Code Playgroud)\n\n不是这个:
\n\n$ type -a .my-handler.sh\nbash: type: .my-handler.sh: not found\nRun Code Online (Sandbox Code Playgroud)安装桌面文件。
\n\n看起来您已经完成了此操作,\n但为了将来参考,您可以使用包desktop-file-install中的\n命令desktop-file-utils:
$ desktop-file-install --dir=$HOME/.local/share/applications/ myprotocol-handler.desktop\nRun Code Online (Sandbox Code Playgroud)\n\n这些是桌面文件中最重要的行:
\n\nExec=.my-handler.sh %u\nMimeType=x-scheme-handler/myprotocol\nRun Code Online (Sandbox Code Playgroud)确保桌面文件是可执行的。
\n\n这样做:
\n\n$ chmod +x ~/.local/share/applications/myprotocol-handler.desktop\nRun Code Online (Sandbox Code Playgroud)\n\n作为一项安全措施,这是必要的。
使用 mimetype\n 注册桌面文件x-scheme-handler/myprotocol。
$ gio mime x-scheme-handler/myprotocol myprotocol-handler.desktop\nSet myprotocol-handler.desktop as the default for x-scheme-handler/myprotocol\nRun Code Online (Sandbox Code Playgroud)\n\n这实际上所做的只是更改组下的~/.config/mimeapps.list行[Default Applications],因此它是这样的:
x-scheme-handler/myprotocol=myprotocol-handler-desktop\nRun Code Online (Sandbox Code Playgroud)\n\n一些较旧的应用程序使用~/.local/share/application/mimeapps.list,\n但这已被正式弃用。\n但是,该xdg-mime命令仍然使用此位置:
$ xdg-mime default myprotocol-handler.desktop x-scheme-handler/myprotocol\nRun Code Online (Sandbox Code Playgroud)\n\n还有一个更旧的已弃用文件\n称为defaults.list\n,某些应用程序仍在使用该文件。\n使用文本编辑器编辑此文件:
$ edit ~/.local/share/applications/defaults.list\nRun Code Online (Sandbox Code Playgroud)\n\n并手动添加这些行:
\n\nx-scheme-handler/myprotocol=myprotocol-handler.desktop\nRun Code Online (Sandbox Code Playgroud)\n\n集团下[Default Applications]。
检查是否注册成功。
\n\n$ gio mime x-scheme-handler/myprotocol\nDefault application for \xe2\x80\x9cx-scheme-handler/myprotocol\xe2\x80\x9d: myprotocol-handler.desktop\nRegistered applications:\n myprotocol-handler.desktop\nRecommended applications:\n myprotocol-handler.desktop\nRun Code Online (Sandbox Code Playgroud)\n\n检查xdg-mime也。
$ xdg-mime query default x-scheme-handler/myprotocol\nmyprotocol-handler.desktop\nRun Code Online (Sandbox Code Playgroud)从命令行测试一些 URL。
\n\n$ gio open \'myprotocol://abcd\'\nRun Code Online (Sandbox Code Playgroud)\n\n现在使用以下命令测试相同的 URL xdg-open:
$ xdg-open \'myprotocol://abcd\'\nRun Code Online (Sandbox Code Playgroud)更新 mimeinfo 缓存。
\n\n某些应用程序读取~/.local/share/applications/mimeinfo.cache\而不是~/.config/mimeapps.list。\n因此更新缓存:
$ update-desktop-database ~/.local/share/applications/\nRun Code Online (Sandbox Code Playgroud)使用本地 HTML 文件在浏览器中进行测试。
\n\n<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="utf-8">\n <title>Example URL</title>\n </head>\n <body>\n <a href="myprotocol://abcd">myprotocol://abcd</a>\n </body>\n</html>\nRun Code Online (Sandbox Code Playgroud)\n\n第一次打开链接时,\nFirefox 将提示您查找桌面文件。
\n\n\n\n导航至~/.local/share/applications/并单击myprotocol-handler.desktop。
还要勾选“记住我对我的协议链接的选择”框。
\n\n\n\n完成后它应该看起来像这样。
\n\n使用远程 HTML 文件在浏览器中对其进行测试。
\n\n本地和远程 HTML 文件之间存在一些安全差异,\n因此最好检查两者。\n您可以为此设置一些托管,\n也可以仅使用 Github 或类似的,但这超出了范围这个问题。