使用xdg-open使用新进程打开URL


13

我开始尝试将Crunchbang(基于Debian,并使用terminator)作为Web开发环境,而我苦苦挣扎的事情之一就是的行为xdg-open。我来自OSX背景,因此,如果这个问题过于复杂,请原谅我。

我希望能够使用打开一个URL,xdg-open http://www.google.com然后继续使用相同的终端窗口来工作(这是openOSX中的功能)。现在,使用会xdg-open占据当前选项卡/会话,直到我关闭浏览器窗口,或手动结束ctrl + c。我非常希望它启动一个新过程,这样我可以打开一个URL,引用页面上的数据,然后在同一选项卡/窗口中使用它,而无需打开其他窗口。


您正在使用什么网络浏览器?
Cristian Ciupitu 2014年

Answers:


11

奇怪,它在我的Debian上开箱即用。尝试在后台运行它:

xdg-open http://www.google.com &

您可以通过将以下几行添加到~/.bashrc文件中来使其成为函数:

function open () {
    xdg-open "$*" &
}

然后,您可以简单地运行open http://www.google.com,它将在后台运行。


1
这很好。我希望对拥有一个简单的别名open(即open ='xdg-open'),是否有一种xdg-open <url> &无需使用shell函数就可以获取其功能的方法?
尼克·汤姆林

@NickTomlin据我所知,不,但是对功能有什么反对?如您在更新后的答案中所见,它几乎和别名一样简单。
terdon

这不是一个特别的偏见,我希望避免使用某个函数,因为我试图为Mac OS和* nix风格使用(并重用)相同的别名。
尼克·汤姆林

没有理由为什么你不能。功能取决于外壳程序,只要您在所有有问题的系统中使用bash,它就可以很好地工作。
terdon

它也可以在Fedora 20上使用。
Cristian Ciupitu 2014年

7

如果您想将进程与当前shell分离,而不是使用作为后台作业启动它xdg-open http://www.google.com &,我喜欢该detach实用程序:

detach xdg-open http://www.google.com

可以为此创建别名。我喜欢detachnohup的关闭标准输入输出和错误默认情况下,所以它的调用是清洁的。


3
las,detach我的发行版中似乎不存在。nohup启动该过程,但仍占据终端窗口。
尼克·汤姆林

detach也不在我的发行版中;但python可以处理打开的URL和分离:python -m webbrowser -t "http://example.com"。这几乎可以在几乎所有最近发行的Linux发行版中使用。
克雷斯(Krets)'17

尽管detachAUR中甚至没有,但是事实证明它很容易从源代码安装,并且是唯一实现我想要的功能的程序。(此处和detach网站上列出的替代方法不允许在xdg-open运行时关闭外壳程序,或者至少detach不会让我的外壳程序抱怨一下)
rien333

4

xdg-open等待程序完成。这是设计使然。如果程序是文本模式程序,则它必须留在终端的前台。即使该程序是GUI程序,这种情况也是有用的,以防xdg-open从脚本中使用脚本并且脚本希望在文件被编辑后执行某些操作(例如,将新版本发送到某个地方或以其他方式使用新版本)。

如果您不想等待,请xdg-open在后台运行。您可以在末尾放置与号,从而在后台运行任何shell命令。

xdg-open http://www.google.com &

对于某些程序,xdg-open立即返回。实际上发生的是xdg-open调用的程序立即返回。GUI程序通常在单个实例中打开所有文件时会发生这种情况:第二次启动它们时,它们会向正在运行的实例发送一条消息,告知其打开文件并立即退出。


这样的应用程序如何实现单实例策略?DBus是我所知道的一种方式,但是是否有实现此功能的“ xdg”方式?
PnotNP

@NulledPointer锁定文件,X11窗口消息,D-Bus,...我想D-Bus是“标准” Freedesktop方式,但是我不知道是否有正式的规范。
吉尔(Gilles)'所以

2
在我的Ubuntu 16.04系统上,xdg-open总是立即返回。对于我当前的应用程序,我实际上更喜欢它阻止。您的“ xdg-open等待程序完成。这是设计使然。” 信息从何而来?
查尔·博塔

@CharlBotha xdg-open立即返回(我可以在Ubuntu 16.04上确认这一点),但是它调用的程序可能会移到后台。例如,在我的系统上,xdg-open为PDF文件调用Evince。evince foo.pdf除非您已经打开PDF,否则将一直关闭直到您关闭PDF文件为止,在这种情况下,第二个evince过程首先xdg-open聚焦现有实例并退出。xdg-open除非有办法使程序保持正在运行的进程,否则无法对此进行控制。
吉尔斯(Gilles)'所以

@吉尔斯我想你误解了查尔·博塔。您的答案是“ xdg-open等待程序完成。这是设计使然。” 但是随后您的评论说“ xdg-open立即返回”……这是矛盾的。
cheshirekow

1

通过结合terdon的回答Dan D.的讨论,nohup我创建了一个函数,该函数完全可以实现我想要的功能:

  1. 在所选应用中打开文件,而无需任何写入终端的操作。
  2. 取消该过程,以便可以关闭终端窗口。
  3. 不会将应用程序产生的任何错误写入终端。

我将此添加到我的.bashrc/.zshrc文件中:

function open () {
  nohup xdg-open "$*" > /dev/null 2>&1
}

了解有关隐藏隐藏的讨论/dev/null 2>&1请参见。stdoutstderr


0

尝试这个:

DISPLAY=:0.0; xdg-open '<url>'

我使用此技术将magnet:// URL排队到我的Bit Torrent客户端Vuze中。

ssh someserver "DISPLAY=:0.0; xdg-open 'http://www.google.com/'"

单引号有助于保护URL的内容,以便外壳程序不会尝试解释它们。


这仍然使进程在当前终端窗口中运行。让我知道是否需要澄清我的问题。
尼克·汤姆林

是的,如果您希望它立即变为背景,则只需将其与符号“&”放到背景中即可。那不是@terdon的答案吗?
slm

这里的问题不是xdg-open,请参阅@Gilles答案,他解释了为什么阻止xdg-open的原因,这是您要发送URL的GUI,导致xdg-open等待。
slm

您要将URL发送到哪个浏览器?发送带有w的URL时,是否存在对话框或其他任何弹出窗口xdg-open?似乎这里的几个答复者已指示正常行为是在一段时间后将控制权返回给终端。
slm

感谢您的澄清。我已经审查了答案,现在我对此有了更好的了解。浏览器是iceweasal。
尼克·汤姆林

0

如果需要从命令行(循环)打开网页,则可以在启动脚本之前打开浏览器。

在这种情况下,它不会等待在第一个链接之后关闭浏览器,而是会在新选项卡中将它们全部打开。


0

到今天为止,这些选择都对我没有帮助。我完全知道OP会说“ use xdg-open”,请提前对不起。

我最终做的很简单chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es

如果您没有这三种浏览器中的任何一种,则可以根据自己的喜好随意使用正确的浏览器。

注意:Firefox确实打开了一个新窗口,没有添加任何内容。保护套不适用于您,请使用firefox https://google.es -new-instance -new-window。请注意,这只是-Firefox标记之一。


0

放弃是正确的命令。

我为此使用2个函数,以使其更具可读性。

f_x()
{
   xdg-open "$1" &
   disown
}

x()
{
   f_x "$*" > /dev/null 2>&1
}

什么,您认为调用另一个函数的函数比一个三行长的函数更易于阅读和理解?
G-Man说'Resstate Monica''19

disown不能阻止将错误发送到终端。
LondonRob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.