我有几个 Firefox 实例,其中运行着几个不同的配置文件。其中配置文件的名称为“软件”和“测试”。
我正在尝试从 bash 脚本打开一个 URL,以便在配置文件“测试”中打开它,如下所示:
firefox -P "test" http://www.example.org/
但是无论如何,它都会在配置文件“软件”中打开。有什么想法吗?
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100308 Iceweasel/3.5.8(如 Firefox/3.5.8)
不,这不是权限问题,我的所有配置文件目录都完全符合我的权限:
root@przehyba:~/.mozilla# ls -ld firefox/
drwx------ 13 miernik miernik 4096 Mar 11 09:15 firefox/
root@przehyba:~/.mozilla# ls -ld firefox/*
drwxr-xr-x 9 miernik miernik 4096 Mar 12 11:29 firefox/info
-rw-r--r-- 1 miernik miernik 560 Mar 11 09:15 firefox/profiles.ini
drwxr-xr-x 10 miernik miernik 4096 Mar 16 11:51 firefox/software
drwxr-xr-x 9 miernik miernik 4096 Mar 11 09:14 firefox/tech
drwxr-xr-x 11 miernik miernik 4096 Mar 15 22:48 firefox/test
root@przehyba:~/.mozilla#
答案1
抱歉回答晚了三年,我刚刚开始对这个话题感兴趣并发现了这个问题。
我没有在任何地方找到记录的解决方案,因此我检查了源代码,这里是非常相关的部分: http://dxr.mozilla.org/mozilla-central/source/toolkit/xre/nsAppRunner.cpp#1537
这里,行尾的 nullptr 不幸意味着 profile 参数没有传递给 SendCommandLine 函数,因此无法选择正确的 Firefox 窗口来发送 openurl 消息。
但是,我们看到用户名正在被传递,并且用户名正在从 LOGNAME 环境变量中初始化。基于此,我想出了以下解决方案:
- 我用这个名为 firefox.sh 的脚本包装 Firefox:
FOX_PROFILE=facebook 导出 LOGNAME=errge.$FOX_PROFILE /opt/firefox/firefox -profile ~/.mozilla_profiles/$FOX_PROFILES “$@”
第一次运行时,它会启动一个新实例,并且 ~/.mozilla_profiles/facebook 目录必须存在,
第二次运行时,如果 Facebook 配置文件已在运行,它会正确连接到它,
它可以正确地向多个不同的运行配置文件发送命令(当然你必须在不同的脚本中更改第一行的FOX_PROFILE参数)。
我在 Linux 上使用 Firefox 26 进行了测试并且有效。
或者,这是我的完整解决方案,您可能想要或不想使用:
/bin/bash #!/bin/bash 设置-e 福克斯=/opt/firefox/firefox 消息=$@ 如果 [ -z "$FOX_PROFILE" ]; 那么 如果 [ -z "${MESSAGE}" ]; 那么 FOX_PROFILE=默认 别的 FOX_PROFILE=$(kdialog --default default --menu "-- ${MESSAGE} --" default default google google facebook facebook errge errge spam spam) 菲 菲 导出FOX_PROFILE # 这个 hack 是必要的,因为 Firefox 远程命令行发送 # 忽略配置文件参数。参见 nsAppRunner.cpp:1505。 导出 LOGNAME=errge.$FOX_PROFILE # 使用后台执行而不是 exec,因此行为是 # 当配置文件已在运行时和刚运行时一致 # 启动。 $FOX -profile ~/.mozilla_profiles/$FOX_PROFILE "$@" # 巨大的成功。 出口 0
如果您运行该脚本时不带任何参数,它会自动选择默认配置文件,但您可以通过在 shell 中手动设置 FOX_PROFILE 来覆盖它。如果在命令行中传递了 URL,它总是会要求提供一个配置文件来打开它,这是因为我主要从聊天和电子邮件程序中点击,在这些情况下,我希望始终选择一个配置文件(google 用于日历垃圾邮件,facebook 用于生日垃圾邮件,等等)。当然,您可以更改逻辑以适合您的使用风格,这只是一个例子,重要的知识是 LOGNAME 技巧。
当然,您必须确保此包装器脚本是启动您机器上的浏览器的唯一方法。因为如果您打开的配置文件没有设置正确的 LOGNAME,那么您将无法再与该配置文件通信。我通过多个符号链接名称(如 x-www-browser、firefox、sensible-browser)将此脚本放在我的路径中的第一个位置,并将其也放在 BROWSER 环境变量中。如何执行此操作完全取决于您的 GNU/Linux 发行版。
答案2
基于Att Righ 的回答我开发了以下解决方案,可以根据 URL 自动选择正确的配置文件。
该包装脚本在 Ubuntu Linux 20.04.6 和 Mozilla Firefox 104.0 上进行了测试。
!/bin/bash
if [[ "$@" =~ .*"google."|"facebook.com"|"instagram.com".* ]]
then
profile=for_evil_sites
else
profile=default
fi
if pgrep --full "firefox\b.*$profile" > /dev/null; then
/usr/bin/firefox -P "$profile" "$@" > /dev/null
else
/usr/bin/firefox --new-instance -P "$profile" "$@" > /dev/null
disown $!
fi
使用名称firefox
eg in保存脚本$HOME/bin/
,并确保将加载该脚本而不是标准 Firefox。(目录必须位于变量中的原始目录之前$PATH
。)
答案3
如果您已有一个正在运行的实例,Firefox 将重用该实例。请尝试firefox -no-remote
。
答案4
它不起作用。要运行 Mozilla 应用程序的 2 个实例,唯一的方法是禁用与第二个实例的远程连接(通常使用 MOZ_NO_REMOTE=1)。这意味着您禁用了它与其他实例(如创建打开新页面的实例)通信的能力。
因此,您的选择是打开一个no remote
启用的新应用程序,或者重用允许远程访问的实例。