¿Manera limpia de iniciar el navegador web desde el script de shell?

101

En un script bash, necesito iniciar el navegador web del usuario. Parece que hay muchas formas de hacer esto:

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

¿Existe una forma más estándar que las demás de hacer esto que funcione en la mayoría de las plataformas, o debería elegir algo como esto?

#/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
fuente
Tu solución me parece bien
Jamie Wong
Sí, aunque
cambiaría
4
Tenga cuidado con sus URL. Es fácil conseguir un personaje que me guste ?o &que deba ser citado.
Gabe
Debería poder eliminar eval(es un riesgo de seguridad):$BROWSER http://wwww.google.com
Pausado hasta nuevo aviso.
También hay sensible-browser.
Caracol mecánico

Respuestas:

71

xdg-open está estandarizado y debería estar disponible en la mayoría de las distribuciones.

De otra manera:

  1. eval es malvado, no lo uses.
  2. Cite sus variables.
  3. Utilice los operadores de prueba correctos de la manera correcta.

Aquí hay un ejemplo:

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

Quizás esta versión sea un poco mejor (aún no probada):

#!/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
fuente
Oh si por supuesto. Gracias. (Primero me hubiera gustado usar la -sopción, pero eso no parece existir en Linux.)
Philipp
2
Hice el menos uno por decir que eval es malvado. Esto es bash, no javascript. Las frases de captura no se transmiten a través de los lenguajes de programación.
Darth Egregious
3
excepto que no está disponible en OSX
gka
1
Hermoso uso de bash (segunda versión)! aprendí algo nuevo hoy.
Brokenfoot
96
python -mwebbrowser http://example.com

funciona en muchas plataformas

jfs
fuente
3
Si el usuario tiene Python instalado ... ¡Pero gracias por mencionar el webbrowsermódulo!
nicoulaj
2
@JulienNicoulaud Acabo de instalar Debian y Python está ahí. Creo que está incluido con muchas distribuciones de Linux.
Tomáš Zato - Reincorpora a Monica
Es un buen módulo, pero no parece funcionar con archivos locales. Este sería un caso de uso común al realizar desarrollo web.
Hexatonic
3
@Hexatonic: funciona con archivos locales, por ejemplo,python -m webbrowser file:///usr/share/doc/python/FAQ.html
jfs
56

OSX:

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

o

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

o simplemente...

$ open some_url
mbs400
fuente
11
Eso tampoco es muy portátil, pero sí, así es como se hace en OSX.
tripleee
2
¡La pregunta dice "en la mayoría de las plataformas"!
Caracol mecánico
9
Algunos de nosotros usamos OSX, por lo que esta respuesta es útil.
15

Puedes usar lo siguiente:

x-www-browser

No ejecutará el navegador X predeterminado del usuario, sino el del sistema.

Ver: este hilo.

Joan Rieu
fuente
x-www-browser <url>hace el trabajo muy bien!
Basster
4
No existe en Mac OS.
jamescampbell
4
Lol, solo vine aquí para comentar sobre esto y vi que mi yo anterior lo había comentado el año pasado. Esto es algo de matriz / inicio.
jamescampbell
0

Tomando las otras respuestas y creando una versión que funcione para todos los sistemas operativos principales, además de verificar para asegurarse de que se pase una URL como una variable de tiempo de ejecución:

#!/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
fuente
-7

Es posible que esto no se aplique exactamente a lo que desea hacer, pero existe una manera realmente fácil de crear e iniciar un servidor utilizando el http-serverpaquete npm .

Una vez instalado (solo npm install http-server -g) puedes poner

http-server -o

en su script bash y lanzará un servidor desde el directorio actual y abrirá un navegador a esa página.

Raphi
fuente
3
Esto requiere npmser instalado + http-serverpaquete + inicia un servidor web innecesario ...
nicoulaj
1
Si va a usar npm, hay un paquete llamado open, pero aún es excesivo
Matt Fletcher