Sauberer Weg, um den Webbrowser von Shell-Skript zu starten?

101

In einem Bash-Skript muss ich den Benutzer-Webbrowser starten. Es scheint viele Möglichkeiten zu geben, dies zu tun:

  • $BROWSER
  • xdg-open
  • gnome-open auf GNOME
  • www-browser
  • x-www-browser
  • ...

Gibt es eine Standardmethode als die anderen, die auf den meisten Plattformen funktioniert, oder sollte ich einfach so etwas tun:

#/usr/bin/env bash

if [ -n $BROWSER ]; then
  $BROWSER 'http://wwww.google.com'
elif which xdg-open > /dev/null; then
  xdg-open 'http://wwww.google.com'
elif which gnome-open > /dev/null; then
  gnome-open 'http://wwww.google.com'
# elif bla bla bla...
else
  echo "Could not detect the web browser to use."
fi
nicoulaj
quelle
Ihre Lösung scheint mir in Ordnung zu sein
Jamie Wong
Ja, obwohl ich xdg-open und gnome-open tauschen würde
ninjalj
4
Seien Sie vorsichtig mit Ihren URLs. Es ist einfach, einen Charakter wie ?oder &dort zu finden, der zitiert werden muss.
Gabe
Sie sollten in der Lage sein, eval$BROWSER http://wwww.google.com
Folgendes zu löschen
Es gibt auch sensible-browser.
Mechanische Schnecke

Antworten:

71

xdg-open ist standardisiert und sollte in den meisten Distributionen verfügbar sein.

Andernfalls:

  1. eval ist böse, benutze es nicht.
  2. Zitieren Sie Ihre Variablen.
  3. Verwenden Sie die richtigen Testoperatoren auf die richtige Weise.

Hier ist ein Beispiel:

#!/bin/bash
if which xdg-open > /dev/null
then
  xdg-open URL
elif which gnome-open > /dev/null
then
  gnome-open URL
fi

Vielleicht ist diese Version etwas besser (noch nicht getestet):

#!/bin/bash
URL=$1
[[ -x $BROWSER ]] && exec "$BROWSER" "$URL"
path=$(which xdg-open || which gnome-open) && exec "$path" "$URL"
echo "Can't find browser"
Philipp
quelle
Oh ja natürlich. Vielen Dank. (Zuerst hätte ich gerne die -sOption verwendet, aber das scheint unter Linux nicht zu existieren.)
Philipp
3
Ist es nicht schlecht, whichBinärdateien zu erkennen ?
Msanford
2
Ich habe das Minus gemacht, weil ich gesagt habe, dass eval böse ist. Dies ist Bash, kein Javascript. Schlagworte sind nicht programmiersprachenübergreifend.
Darth Egregious
3
außer es ist nicht verfügbar in OSX
gka
1
Schöne Verwendung von Bash (2. Version)! habe heute etwas Neues gelernt.
gebrochener Fuß
96
python -mwebbrowser http://example.com

funktioniert auf vielen Plattformen

jfs
quelle
3
Wenn der Benutzer Python installiert hat ... Aber danke, dass Sie das webbrowserModul erwähnt haben!
Nicoulaj
2
@ JulienNicoulaud Ich habe gerade Debian installiert und Python ist da. Ich denke, es ist mit vielen Linux-Distributionen gebündelt.
Tomáš Zato - Wiedereinsetzung Monica
Es ist ein schönes Modul, aber es scheint nicht mit lokalen Dateien zu funktionieren. Dies ist ein häufiger Anwendungsfall bei der Webentwicklung.
Hexatonic
3
@ Hexatonic: Es funktioniert mit lokalen Dateien, zBpython -m webbrowser file:///usr/share/doc/python/FAQ.html
jfs
56

OSX:

$ open -a /Applications/Safari.app http://www.google.com

oder

$ open -a /Applications/Firefox.app http://www.google.com

oder einfach...

$ open some_url
mbs400
quelle
11
Das ist auch kaum sehr portabel, aber so macht man es unter OSX.
Tripleee
2
Die Frage lautet "auf den meisten Plattformen"!
Mechanische Schnecke
9
Einige von uns verwenden OSX, daher ist diese Antwort hilfreich.
15

Sie könnten Folgendes verwenden:

x-www-browser

Der Benutzer wird nicht ausgeführt, sondern der Standard-X-Browser des Systems.

Siehe: dieser Thread.

Joan Rieu
quelle
x-www-browser <url>macht den Job sehr gut!
Basster
4
Existiert nicht unter Mac OS.
Jamescampbell
4
Lol, ich bin gerade hierher gekommen, um dies zu kommentieren und habe gesehen, dass mein vorheriges Ich es letztes Jahr kommentiert hat. Dies ist ein Matrix / Inception-Zeug.
Jamescampbell
0

Nehmen Sie die anderen Antworten und erstellen Sie eine Version, die für alle gängigen Betriebssysteme funktioniert, und überprüfen Sie, ob eine URL als Laufzeitvariable übergeben wird:

#!/bin/bash
if [ -z $1 ]; then
  echo "Must run command with the url you want to visit."
  exit 1
else
  URL=$1
fi
[[ -x $BROWSER ]] && exec "$BROWSER" "$URL"
path=$(which xdg-open || which gnome-open) && exec "$path" "$URL"
if open -Ra "safari" ; then
  echo "VERIFIED: 'Safari' is installed, opening browser..."
  open -a safari "$URL"
else
  echo "Can't find any browser"
fi
Jamescampbell
quelle
-7

Dies trifft möglicherweise nicht genau auf das zu, was Sie tun möchten, aber es gibt eine wirklich einfache Möglichkeit, einen Server mit dem http-servernpm-Paket zu erstellen und zu starten .

Einmal installiert (nur npm install http-server -g) können Sie setzen

http-server -o

In Ihrem Bash-Skript wird ein Server aus dem aktuellen Verzeichnis gestartet und ein Browser für diese Seite geöffnet.

Raphi
quelle
3
Dies muss npminstalliert sein + http-serverPaket + startet einen nicht benötigten Webserver ...
Nicoulaj
1
Wenn Sie npm verwenden wollen, gibt es ein Paket namens open, aber es ist immer noch übertrieben
Matt Fletcher