Czysty sposób na uruchomienie przeglądarki internetowej ze skryptu powłoki?

101

W skrypcie bash muszę uruchomić przeglądarkę internetową użytkownika. Wydaje się, że jest na to wiele sposobów:

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

Czy istnieje bardziej standardowy sposób na zrobienie tego niż inne, który działałby na większości platform, czy powinienem po prostu wybrać coś takiego:

#/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
źródło
Twoje rozwiązanie wydaje mi się w porządku
Jamie Wong
Tak, chociaż zamieniłbym xdg-open i gnome-open
Ninjalj
4
Uważaj na swoje adresy URL. Łatwo jest znaleźć znak taki jak ?lub &tam, który należy zacytować.
Gabe
Powinieneś być w stanie upuścić eval(jest to zagrożenie bezpieczeństwa):$BROWSER http://wwww.google.com
Wstrzymano do odwołania.
Jest też sensible-browser.
Ślimak mechaniczny,

Odpowiedzi:

71

xdg-open jest znormalizowany i powinien być dostępny w większości dystrybucji.

Inaczej:

  1. eval jest zły, nie używaj go.
  2. Cytuj swoje zmienne.
  3. Używaj właściwych operatorów testów we właściwy sposób.

Oto przykład:

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

Może ta wersja jest nieco lepsza (wciąż nieprzetestowana):

#!/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
źródło
Oh tak, oczywiście. Dzięki. (Najpierw chciałbym skorzystać z tej -sopcji, ale wydaje się, że ona nie istnieje w Linuksie.)
Philipp
2
Zrobiłem minus jeden za stwierdzenie, że eval jest zły. To jest bash, a nie javascript. Frazy przechwytujące nie są przenoszone między językami programowania.
Darth Egregious
3
z wyjątkiem tego, że nie jest dostępny w OSX
gka
1
Piękne wykorzystanie basha (druga wersja)! nauczyłem się dziś czegoś nowego.
brokenfoot
96
python -mwebbrowser http://example.com

działa na wielu platformach

jfs
źródło
3
Jeśli użytkownik ma zainstalowany Python ... Ale dzięki za wspomnienie o webbrowsermodule!
nicoulaj
2
@JulienNicoulaud Właśnie zainstalowałem Debiana i jest tam Python. Myślę, że jest dołączony do wielu dystrybucji Linuksa.
Tomáš Zato - Przywróć Monikę
To fajny moduł, ale wygląda na to, że nie działa z lokalnymi plikami. Byłby to typowy przypadek użycia podczas tworzenia stron internetowych.
Hexatonic
3
@Hexatonic: Działa z plikami lokalnymi, np.python -m webbrowser file:///usr/share/doc/python/FAQ.html
jfs,
56

OSX:

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

lub

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

lub po prostu...

$ open some_url
mbs400
źródło
11
To też nie jest zbyt przenośne, ale tak, tak to robisz na OSX.
tripleee
2
Pytanie brzmi „na większości platform”!
Mechaniczny ślimak
9
Niektórzy z nas używają OSX, więc ta odpowiedź jest przydatna.
15

Możesz użyć następujących:

x-www-browser

Nie uruchomi użytkownika, ale raczej domyślną przeglądarkę X systemu.

Zobacz: ten wątek.

Joan Rieu
źródło
x-www-browser <url>wykonuje swoją pracę bardzo dobrze!
Basster
4
Nie istnieje w systemie Mac OS.
jamescampbell
4
Lol, przyszedłem tutaj, aby to skomentować i zobaczyłem, że moja poprzednia ja skomentowała to w zeszłym roku. To jest jakaś matryca / inicjacja.
jamescampbell
0

Biorąc inne odpowiedzi i tworząc wersję, która działa dla wszystkich głównych systemów operacyjnych, a także sprawdzając, czy adres URL jest przekazywany jako zmienna czasu wykonywania:

#!/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
źródło
-7

Może to nie dotyczyć dokładnie tego, co chcesz zrobić, ale istnieje naprawdę łatwy sposób na utworzenie i uruchomienie serwera przy użyciu http-serverpakietu npm .

Po zainstalowaniu (po prostu npm install http-server -g) możesz umieścić

http-server -o

w skrypcie bash i uruchomi serwer z bieżącego katalogu i otworzy przeglądarkę tej strony.

Raphi
źródło
3
Wymaga npmto zainstalowania + http-serverpakietu + uruchomienia niepotrzebnego serwera WWW ...
nicoulaj
1
Jeśli zamierzasz używać npm, jest pakiet o nazwie open, ale nadal jest przesadą
Matt Fletcher