Maneira limpa de iniciar o navegador da web a partir do script de shell?


101

Em um script bash, preciso iniciar o navegador do usuário. Parece haver muitas maneiras de fazer isso:

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

Existe uma maneira mais padrão do que as outras de fazer isso que funcionaria na maioria das plataformas, ou devo apenas escolher algo assim:

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

Sua solução parece boa para mim
Jamie Wong

Sim, embora eu trocasse xdg-open e gnome-open
ninjalj

4
Tenha cuidado com seus URLs. É fácil conseguir um personagem igual ?ou &ali que precisa ser citado.
Gabe

Você deve ser capaz de descartar eval(é um risco à segurança):$BROWSER http://wwww.google.com
Pausado até novo aviso.

Há também sensible-browser.
Caracol mecânico de

Respostas:


71

xdg-open é padronizado e deve estar disponível na maioria das distribuições.

De outra forma:

  1. eval é mau, não o use.
  2. Cite suas variáveis.
  3. Use os operadores de teste corretos da maneira correta.

Aqui está um exemplo:

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

Talvez esta versão seja um pouco melhor (ainda não testada):

#!/bin/bash
URL=$1
[[ -x $BROWSER ]] && exec "$BROWSER" "$URL"
path=$(which xdg-open || which gnome-open) && exec "$path" "$URL"
echo "Can't find browser"

Ah sim, claro. Obrigado. (Primeiro eu gostaria de usar a -sopção, mas ela não parece existir no Linux.)
Philipp


2
Eu fiz o menos por dizer que eval é mau. Isso é bash, não javascript. Frases de efeito não são transmitidas por linguagens de programação.
Darth Egregious

3
exceto que não está disponível no OSX
gka

1
Belo uso do bash (2ª versão)! aprendi algo novo hoje.
brokenfoot

96
python -mwebbrowser http://example.com

funciona em muitas plataformas


3
Se o usuário tiver o Python instalado ... Mas obrigado por mencionar o webbrowsermódulo!
nicoulaj

2
@JulienNicoulaud Acabei de instalar o debian e o python está lá. Acho que vem com muitas distribuições de Linux.
Tomáš Zato - Reintegração de Monica

É um bom módulo, mas não parece funcionar com arquivos locais. Este seria um caso de uso comum ao fazer desenvolvimento web.
Hexatonic 01 de

3
@Hexatonic: Funciona com arquivos locais, por exemplo,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 simplesmente...

$ open some_url

11
Isso dificilmente é muito portátil, mas sim, é assim que você faz no OSX.
tripleee

2
A pergunta diz "na maioria das plataformas"!
Caracol mecânico

9
Alguns de nós estão usando OSX, então esta resposta é útil.

15

Você pode usar o seguinte:

x-www-browser

Ele não executará o navegador do usuário, mas sim o navegador X padrão do sistema.

Veja: este tópico.


x-www-browser <url>faz o trabalho muito bem!
Basster

4
Não existe no Mac OS.
jamescampbell

4
Lol, eu só vim aqui para comentar sobre isso e vi que meu eu anterior tinha comentado no ano passado. Isso é alguma coisa de matriz / iniciação.
jamescampbell

0

Pegando as outras respostas e criando uma versão que funcione para todos os principais sistemas operacionais, além de verificar se um URL é passado como uma variável de tempo de execução:

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

Isso pode não se aplicar exatamente ao que você deseja fazer, mas há uma maneira realmente fácil de criar e iniciar um servidor usando o http-serverpacote npm .

Depois de instalado (apenas npm install http-server -g), você pode colocar

http-server -o

em seu script bash e ele irá lançar um servidor do diretório atual e abrir um navegador para aquela página.


3
Isso requer npminstalação + http-serverpacote + inicia um servidor web desnecessário ...
nicoulaj

1
Se você for usar o npm, há um pacote chamado open, mas ainda é um exagero
Matt Fletcher
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.