xdg-open 打开指定的 htm 文件,但忽略页面内的标记 (#) 位置

xdg-open 打开指定的 htm 文件,但忽略页面内的标记 (#) 位置

我在 bash 脚本 (openWebPage) 中有一个函数,我想打开一个网页并导航到页面内的 id 标签。

url 组件保存在变量中

PIXPAGE="/home/bu5hman/pix/pixpages/media.bu5hman.2005-.video.htm"
TT="tt0078435"

对函数的调用构成变量

openWebPage "$PIXPAGE#$TT"

在该函数中,如果我直接使用指定了标签的文件 url 硬编码对默认浏览器(seamonkey)的调用

/home/bu5hman/Installs/seamonkey/seamonkey "file://$1"

页面在所需标签处打开,但是使用

xdg-open "file://$1"

在顶部打开网页,但不会导航到页面内的标签。

当直接调用浏览器时,它会在导航栏中打开完整的 url 和标签,但是当使用 xgd-open 调用时,它会在导航栏中打开去掉标签的 url (#tt0078435)。

看起来 xdg-open 在将 url 传递给应用程序之前会从 url 中删除标签。

除了使用脚本询问系统的默认浏览器并编写直接调用之外,是否有办法阻止 xdg-open 剥离标签或使用替代的跨平台调用来打开标签处的网页?

答案1

感谢 @Ignacio Vazquez-Abrams 的指点,找到了解决方案。

问题实际上在于xdg-open将参数传递给默认应用程序的方式。

如果默认应用程序注册在kde桌面以便期待一个 url (%u)

/home/bu5hman/Installs/seamonkey/seamonkey %u

然后传递给的整个参数xdg-open用作 url,浏览器导航到该标签。

如果省略 %u,则xdg-open测试传递给的参数以查看它是否是一个文件,然后从 url 中的 # 中删除信息(来自脚本xdg-open

# If argument is a file URL, convert it to a (percent-decoded) path.
# If not, leave it as it is.
file_url_to_path()
{
    local file="$1"
    if echo "$file" | grep -q '^file:///'; then
        file=${file#file://}
        file=${file%%#*}                                #<----------
        file=$(echo "$file" | sed -r 's/\?.*$//')
        local printf=printf
        if [ -x /usr/bin/printf ]; then
            printf=/usr/bin/printf
        fi
        file=$($printf "$(echo "$file" | sed -e 's@%\([a-f0-9A-F]\{2\}\)@\\x\1@g')")
    fi
    echo "$file"
}

并且页面仅在顶部打开。

就我而言,firefox 已使用 %u 注册,而 seamonkey 未注册,这就是为什么我在这两个浏览器中表现不同的原因。

相关内容