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
nicoulaj
fonte
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"
Philipp
fonte
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

jfs
fonte
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
mbs400
fonte
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.

Joan Rieu
fonte
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
Jamescampbell
fonte
-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.

Raphi
fonte
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