Un moyen propre de lancer le navigateur Web à partir du script shell?

101

Dans un script bash, je dois lancer le navigateur Web de l'utilisateur. Il semble y avoir plusieurs façons de procéder:

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

Existe-t-il un moyen plus standard que les autres de faire cela qui fonctionnerait sur la plupart des plates-formes, ou devrais-je simplement opter pour quelque chose comme ceci:

#/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
la source
Votre solution me semble bien
Jamie Wong
Ouais, même si
j'échangerais
4
Faites attention à vos URL. Il est facile d'obtenir un personnage comme ?ou &dedans qui doit être cité.
Gabe
Vous devriez être en mesure de supprimer le eval(c'est un risque de sécurité):$BROWSER http://wwww.google.com
pause jusqu'à nouvel ordre.
Il y a aussi sensible-browser.
Escargot mécanique du

Réponses:

71

xdg-open est standardisé et devrait être disponible dans la plupart des distributions.

Autrement:

  1. eval est le mal, ne l'utilisez pas.
  2. Citez vos variables.
  3. Utilisez les bons opérateurs de test de la bonne manière.

Voici un exemple:

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

Peut-être que cette version est légèrement meilleure (toujours non testée):

#!/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
la source
Oh oui bien sûr. Merci. (J'aurais d'abord aimé utiliser l' -soption, mais cela ne semble pas exister sous Linux.)
Philipp
2
J'ai fait le moins un pour dire que eval est mauvais. Ceci est bash, pas javascript. Les phrases de capture ne sont pas transmises à travers les langages de programmation.
Darth Egregious
3
sauf qu'il n'est pas disponible sous OSX
gka
1
Belle utilisation de bash (2ème version)! appris quelque chose de nouveau aujourd'hui.
brokenfoot
96
python -mwebbrowser http://example.com

fonctionne sur de nombreuses plateformes

jfs
la source
3
Si l'utilisateur a installé Python ... Mais merci d'avoir mentionné le webbrowsermodule!
nicoulaj
2
@JulienNicoulaud Je viens d'installer debian et python est là. Je pense qu'il est fourni avec de nombreuses distributions Linux.
Tomáš Zato - Réintégrer Monica
C'est un bon module, mais il ne semble pas fonctionner avec les fichiers locaux. Ce serait un cas d'utilisation courant lors du développement Web.
Hexatonic
3
@Hexatonic: Cela fonctionne avec les fichiers locaux, par exemple,python -m webbrowser file:///usr/share/doc/python/FAQ.html
jfs
56

OSX:

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

ou

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

ou simplement...

$ open some_url
mbs400
la source
11
Ce n'est guère très portable non plus, mais oui, c'est comme ça que vous le faites sur OSX.
tripleee
2
La question dit "sur la plupart des plateformes"!
Escargot mécanique du
9
Certains d'entre nous utilisent OSX, cette réponse est donc utile.
15

Vous pouvez utiliser les éléments suivants:

x-www-browser

Il n'exécutera pas l'utilisateur mais plutôt le navigateur X par défaut du système.

Voir: ce fil.

Joan Rieu
la source
x-www-browser <url>fait très bien le travail!
Basster
4
N'existe pas sous Mac OS.
jamescampbell
4
Lol, je suis juste venu ici pour commenter cela et j'ai vu que mon ancien moi avait commenté l'an dernier. Ceci est un truc de matrice / création.
jamescampbell
0

Prendre les autres réponses et créer une version qui fonctionne pour tous les principaux systèmes d'exploitation, ainsi que vérifier qu'une URL est transmise en tant que variable d'exécution:

#!/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
la source
-7

Cela peut ne pas s'appliquer exactement à ce que vous voulez faire, mais il existe un moyen très simple de créer et de lancer un serveur à l'aide du http-serverpackage npm .

Une fois installé (juste npm install http-server -g), vous pouvez mettre

http-server -o

dans votre script bash et il lancera un serveur à partir du répertoire actuel et ouvrira un navigateur sur cette page.

Raphi
la source
3
Cela nécessite npmd'être installé + http-serverpackage + lance un serveur Web inutile ...
nicoulaj
1
Si vous allez utiliser npm, il y a un package appelé open, mais c'est toujours excessif
Matt Fletcher