我在 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 未注册,这就是为什么我在这两个浏览器中表现不同的原因。