Modo pulito per avviare il browser Web dallo script della shell?


101

In uno script bash, devo avviare il browser web dell'utente. Sembra che ci siano molti modi per farlo:

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

Esiste un modo più standard degli altri per farlo che funzioni sulla maggior parte delle piattaforme, o dovrei semplicemente andare con qualcosa del genere:

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

La tua soluzione mi sembra a posto
Jamie Wong

Sì, anche se scambierei xdg-open e gnome-open
ninjalj

4
Fai attenzione ai tuoi URL. È facile ottenere un personaggio come ?o &lì dentro che deve essere citato.
Gabe

Dovresti essere in grado di eliminare il eval(è un rischio per la sicurezza):$BROWSER http://wwww.google.com
In pausa fino a nuovo avviso.

C'è anche sensible-browser.
Lumaca meccanica

Risposte:


71

xdg-open è standardizzato e dovrebbe essere disponibile nella maggior parte delle distribuzioni.

Altrimenti:

  1. eval è cattivo, non usarlo.
  2. Cita le tue variabili.
  3. Utilizzare gli operatori di test corretti nel modo corretto.

Ecco un esempio:

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

Forse questa versione è leggermente migliore (ancora non testata):

#!/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 si, certamente. Grazie. (Per prima cosa mi sarebbe piaciuto usare l' -sopzione, ma sembra che non esista su Linux.)
Philipp


2
Ho fatto il meno per aver detto che eval è malvagio. Questo è bash, non javascript. Le frasi di cattura non vengono trasmesse attraverso i linguaggi di programmazione.
Darth Egregious

3
tranne che non è disponibile in OSX
gka

1
Bellissimo uso di bash (seconda versione)! imparato qualcosa di nuovo oggi.
piede rotto

96
python -mwebbrowser http://example.com

funziona su molte piattaforme


3
Se l'utente ha installato Python ... Ma grazie per aver menzionato il webbrowsermodulo!
nicoulaj

2
@JulienNicoulaud Ho appena installato Debian e Python è lì. Penso che sia fornito in bundle con molte distribuzioni Linux.
Tomáš Zato - Ripristina Monica

È un bel modulo, ma non sembra funzionare con i file locali. Questo sarebbe un caso d'uso comune durante lo sviluppo web.
Esatonico

3
@ Hexatonic: funziona con i file locali, ad esempiopython -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 semplicemente ...

$ open some_url

11
Non è neanche molto portatile, ma sì, è così che lo fai su OSX.
tripleee

2
La domanda dice "sulla maggior parte delle piattaforme"!
Lumaca meccanica

9
Alcuni di noi stanno usando OSX, quindi questa risposta è utile.

15

Potresti usare quanto segue:

x-www-browser

Non eseguirà l'utente ma piuttosto il browser X predefinito del sistema.

Vedi: questo thread.


x-www-browser <url>fa molto bene il lavoro!
Basster

4
Non esiste in Mac OS.
jamescampbell

4
Lol, sono venuto qui solo per commentare questo e ho visto che il mio io precedente lo aveva commentato l'anno scorso. Questa è roba di matrice / inizio.
jamescampbell

0

Prendendo le altre risposte e creando una versione che funzioni per tutti i principali sistemi operativi, oltre a verificare che un URL venga passato come variabile di runtime:

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

Questo potrebbe non applicarsi esattamente a ciò che vuoi fare, ma esiste un modo davvero semplice per creare e avviare un server utilizzando il http-serverpacchetto npm .

Una volta installato (solo npm install http-server -g) puoi mettere

http-server -o

nel tuo script bash e avvierà un server dalla directory corrente e aprirà un browser a quella pagina.


3
Questo richiede npmdi essere installato + http-serverpacchetto + lancia un server web non necessario ...
nicoulaj

1
Se hai intenzione di utilizzare npm, c'è un pacchetto chiamato open, ma è ancora eccessivo
Matt Fletcher
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.