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

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"

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


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

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.


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

-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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.