Verwenden Sie xdg-open, um eine URL mit einem neuen Prozess zu öffnen

13

Ich fange an, mit Crunchbang (das auf Debian basiert und Terminator verwendet ) als Webentwicklungsumgebung zu experimentieren , und eines der Dinge, mit denen ich zu kämpfen habe, ist das Verhalten von xdg-open. Ich komme aus einem OSX-Umfeld, also verzeihen Sie mir, wenn sich diese Frage als dicht herausstellt.

Ich möchte in der Lage sein, eine URL mit zu öffnen xdg-open http://www.google.comund dann weiterhin dasselbe Terminalfenster zu verwenden, um zu arbeiten (so openfunktioniert es in OSX). Im Moment xdg-openbelegt using den aktuellen Tab / die aktuelle Sitzung, bis ich das Browserfenster schließe oder Dinge manuell mit beende ctrl + c. Ich würde es sehr bevorzugen, wenn ein neuer Prozess gestartet wird. Auf diese Weise kann ich eine URL öffnen, auf Daten auf der Seite verweisen und sie in derselben Registerkarte / demselben Fenster verwenden, ohne eine weitere öffnen zu müssen.

Nick Tomlin
quelle
Welchen Webbrowser verwenden Sie?
Cristian Ciupitu

Antworten:

11

Seltsamerweise funktioniert es auf meinem Debian-Rechner so. Versuchen Sie es im Hintergrund auszuführen:

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

Sie können dies zu einer Funktion machen, indem Sie Ihrer ~/.bashrcDatei die folgenden Zeilen hinzufügen :

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

Sie können dann einfach ausführen open http://www.google.comund es wird im Hintergrund ausgeführt.

terdon
quelle
1
Das funktioniert super. Ich hatte gehofft, einen einfachen Alias ​​für zu openhaben (dh open = 'xdg-open'). Gibt es eine Möglichkeit, die Funktionalität von zu erhalten, xdg-open <url> &ohne eine Shell-Funktion zu verwenden?
Nick Tomlin
@NickTomlin Nicht soweit ich weiß, nein, aber was hast du gegen Funktionen? Wie Sie in meiner aktualisierten Antwort sehen können, ist es fast so einfach wie ein Alias.
terdon
Keine besondere Tendenz, ich hatte gehofft, eine Funktion zu vermeiden, da ich versuche, den gleichen Alias ​​für Mac OS und * nix zu verwenden (und wiederzuverwenden).
Nick Tomlin
Kein Grund, warum du nicht konntest. Die Funktionen hängen von der Shell ab. Solange Sie bash in allen fraglichen Systemen verwenden, sollte es einwandfrei funktionieren.
terdon
Es funktioniert auch auf Fedora 20 sofort.
Cristian Ciupitu
7

Wenn Sie den Prozess von der aktuellen Shell trennen möchten, anstatt ihn als Hintergrundjob zu starten xdg-open http://www.google.com &, gefällt mir das detachDienstprogramm:

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

Man könnte dafür einen Alias ​​erstellen. Ich mag detaches, nohupwenn stdin stdout und stderr standardmäßig geschlossen werden, damit der Aufruf sauberer ist.

Dan D.
quelle
3
Leider detachscheint es in meiner Distribution nicht zu existieren. nohupStartet den Prozess, belegt aber immer noch das Terminalfenster.
Nick Tomlin
detachist auch nicht in meiner Distribution; aber Python kann Öffnen URLs und Abnehmen behandeln: python -m webbrowser -t "http://example.com". Dies sollte auf fast allen neueren Linux-Distributionen sofort funktionieren.
Krets
Obwohl detaches nicht einmal in der AUR ist, erwies es sich als einfach, von der Quelle zu installieren und war außerdem das einzige Programm, das das erreichte, was ich wollte. (Die hier und auf der detachWebsite aufgeführten Alternativen erlauben es nicht, die Shell zu schließen, solange sie ausgeführt xdg-openwird, oder haben zumindest detachmeine Shell nicht dazu gebracht, sich ein bisschen zu beschweren.)
rien333
4

xdg-openWartet, bis das Programm beendet ist. Dies ist beabsichtigt. Wenn es sich bei dem Programm um ein Textmodusprogramm handelt, muss es im Terminal im Vordergrund bleiben. Auch wenn das Programm eine grafische Benutzeroberfläche ist, ist dieses Verhalten in bestimmten Fällen hilfreichxdg-open es von einem Skript verwendet wird und das Skript nach dem Bearbeiten der Datei etwas ausführen möchte (z. B. die neue Version an einen anderen Ort senden oder etwas mit der neuen Version erstellen).

Wenn Sie nicht warten möchten, führen Sie xdg-opendas Programm im Hintergrund aus. Sie können jeden Shell-Befehl im Hintergrund ausführen, indem Sie ein kaufmännisches Und am Ende einfügen.

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

Bei einigen Programmen wird xdg-opensofort zurückgegeben. Was tatsächlich passiert, ist, dass das xdg-openaufrufende Programm sofort zurückkehrt. Dies geschieht normalerweise mit GUI-Programmen, die alle Dateien in einer einzelnen Instanz öffnen: Wenn Sie sie ein zweites Mal starten, senden sie der ausgeführten Instanz eine Nachricht, in der sie aufgefordert werden, die Datei zu öffnen, und beenden sie sofort.

Gilles 'SO - hör auf böse zu sein'
quelle
Wie implementieren solche Anwendungen eine Einzelinstanzrichtlinie? DBus ist eine Möglichkeit, die ich kenne, aber gibt es eine xdg-Methode, um dies zu implementieren?
PnotNP
@NulledPointer Lock-Dateien, X11-Fenstermeldungen, D-Bus,… Ich nehme an, D-Bus ist der „Standard“ -Freedesktop-Weg, aber ich weiß nicht, ob es dafür eine formale Spezifikation gibt.
Gilles 'SO - hör auf böse zu sein'
2
Auf meinem Ubuntu 16.04-System kehrt xdg-open immer sofort zurück. Für meine aktuelle Anwendung würde ich eigentlich bevorzugen, dass es blockiert. Wo wartet Ihr "xdg-open darauf, dass das Programm beendet wird. Dies ist beabsichtigt." Informationen kommen von?
Charl Botha
@CharlBotha xdg-openkehrt sofort zurück (ich kann das unter Ubuntu 16.04 bestätigen), aber das Programm, das es aufruft, wird möglicherweise in den Hintergrund verschoben. xdg-openRuft auf meinem System beispielsweise Evince für PDF-Dateien auf. evince foo.pdfblockiert, bis Sie die PDF-Datei schließen, es sei denn, die PDF-Datei ist bereits geöffnet. In diesem Fall fokussiert der zweite evinceProzess, der durch gestartet wird, xdg-opendie vorhandene Instanz und wird beendet. xdg-openhat keine Kontrolle darüber, es sei denn, es gibt eine Möglichkeit, das Programm am Laufen zu halten.
Gilles 'SO- hör auf böse zu sein'
@ Gilles Ich glaube du hast Charl Botha falsch verstanden. Ihre Antwort lautet "xdg-open wartet darauf, dass das Programm beendet wird. Dies ist beabsichtigt.". Aber dann sagt dein Kommentar "xdg-open kehrt sofort zurück" ... was widersprüchlich ist.
Cheshirekow
1

Durch die Kombination von terdon Antwort und Dan D. Diskussionnohup habe ich eine Funktion , die genau das tut , was ich will:

  1. Öffnet die Datei in der gewählten App, ohne dass das Terminal darauf geschrieben werden muss.
  2. Löst den Vorgang, damit das Terminalfenster geschlossen werden kann.
  3. Schreibt keine Fehler, die die App auf dem Terminal erzeugt.

Ich habe dies zu meiner .bashrc/.zshrcDatei hinzugefügt :

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

Für eine Erklärung /dev/null 2>&1siehe diese Diskussion über das Verstecken stdoutundstderr .

LondonRob
quelle
0

Versuche dies:

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

Ich benutze diese Technik, um magnet: // URLs in meinen Bit Torrent-Client Vuze einzureihen.

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

Die einfachen Anführungszeichen schützen den Inhalt der URLs, sodass die Shell nicht versucht, sie zu interpretieren.

slm
quelle
Dadurch wird der Prozess im aktuellen Terminalfenster weiter ausgeführt. Lassen Sie mich wissen, ob ich meine Frage klären muss.
Nick Tomlin
Ja, wenn Sie möchten, dass der Hintergrund sofort angezeigt wird, setzen Sie ihn einfach mit einem kaufmännischen Und "&" in den Hintergrund. Ist das nicht @ terdons Antwort?
slm
Das Problem hier ist nicht xdg-open, siehe @Gilles Antwort. Er erklärt, warum xdg-open blockiert ist. Es ist die GUI, an die Sie die URL senden, die xdg-open warten lässt.
slm
An welchen Browser senden Sie die URL? Wird beim Senden der URLs ein Dialogfeld oder sonst etwas angezeigt xdg-open? Wie es scheint, haben mehrere der hier genannten Antwortenden darauf hingewiesen, dass das normale Verhalten darin besteht, dass die Steuerung nach einiger Zeit wieder an das Terminal zurückgegeben wird.
slm
Danke für die Klarstellung. Ich habe die Antworten überprüft und verstehe das jetzt besser. Der Browser ist iceweasal.
Nick Tomlin
0

Wenn Sie Webseiten über die Befehlszeile (Schleife) öffnen müssen, können Sie einfach den Browser öffnen, bevor Sie das Skript starten.

In diesem Fall wartet es nicht darauf, dass der Browser nach dem ersten Link geschlossen wird, sondern öffnet sie alle in neuen Registerkarten.

Valentina Walx
quelle
0

Bis heute hat keine dieser Optionen für mich funktioniert. Mir ist völlig bewusst, dass das OP "use xdg-open" sagte, sorry im Voraus.

Am Ende habe ich eine ganz einfache Sache gemacht chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es .

Wenn Sie keinen dieser 3 Browser haben, können Sie einfach die richtigen mit Ihrer bevorzugten Reihenfolge verwenden.

Hinweis: Firefox hat ein neues Fenster geöffnet, ohne etwas hinzuzufügen. Fall funktioniert nicht nahtlos für Sie, verwenden Sie firefox https://google.es -new-instance -new-window. Beachten Sie, dass dies nur eine -für Firefox-Flags ist.

m3nda
quelle
0

disown ist dafür der richtige Befehl.

Ich benutze dazu 2 Funktionen, um es lesbarer zu halten.

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

x()
{
   f_x "$*" > /dev/null 2>&1
}
user352672
quelle
Was glauben Sie, dass eine Funktion, die eine andere Funktion aufruft, leichter zu lesen und zu verstehen ist als eine einzelne Funktion, die drei Zeilen lang ist?
G-Man sagt, dass Monica
disownverhindert nicht, dass Fehler an das Terminal gesendet werden.
LondonRob