Чистий спосіб запустити веб-браузер із сценарію оболонки?


101

У сценарії bash мені потрібно запустити веб-браузер користувача. Здається, існує багато способів зробити це:

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

Чи існує більш стандартний, ніж інші, спосіб зробити це, який би працював на більшості платформ, чи мені слід просто піти з таким способом:

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

Твоє рішення мені здається прекрасним
Джеймі Вонг,

Так, хоча я
міняв місцями

4
Будьте обережні щодо своїх URL-адрес. Легко отримати такого персонажа, як там, ?або якого &там потрібно цитувати.
Гейб,

Ви повинні мати можливість відмовитись eval(це небезпека безпеки):$BROWSER http://wwww.google.com
Призупинено до подальшого повідомлення.

Є також sensible-browser.
Механічний равлик

Відповіді:


71

xdg-open стандартизований і повинен бути доступний у більшості дистрибутивів.

В іншому випадку:

  1. eval це зло, не використовуй його.
  2. Процитуйте свої змінні.
  3. Правильно використовуйте правильні тестові оператори.

Ось приклад:

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

Можливо, ця версія трохи краща (все ще не перевірена):

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

О так, звичайно. Дякую. (Спочатку я хотів би скористатися цією -sопцією, але, схоже, це не існує в Linux.)
Philipp


2
Я зробив мінус, сказавши, що eval - це зло. Це bash, а не JavaScript. Лові фрази не містять мови програмування.
Дарт Егрегіоз,

3
за винятком, що це недоступно в OSX
gka

1
Прекрасне використання bash (2-а версія)! сьогодні дізналися щось нове.
зламана ступня

96
python -mwebbrowser http://example.com

працює на багатьох платформах


3
Якщо у користувача встановлений Python ... Але дякую за згадку про webbrowserмодуль!
nicoulaj

2
@JulienNicoulaud Я щойно встановив debian і там є python. Я думаю, що це в комплекті з багатьма дистрибутивами Linux.
Томаш Зато - відновити Моніку

Це приємний модуль, але, схоже, він не працює з локальними файлами. Це було б звичайним випадком використання під час веб-розробки.
Гексатонічний

3
@Hexatonic: Він працює з локальними файлами, наприклад,python -m webbrowser file:///usr/share/doc/python/FAQ.html
jfs

56

OSX:

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

або

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

або просто ...

$ open some_url

11
Це навряд чи дуже портативно, але так, так ви робите це на OSX.
триплі

2
Питання говорить "на більшості платформ"!
Механічний равлик

9
Деякі з нас використовують OSX, тому ця відповідь корисна.

15

Ви можете використовувати наступне:

x-www-browser

Він не буде запускати користувальницький, а швидше стандартний X-браузер системи.

Дивіться: ця тема.


x-www-browser <url>робить роботу дуже добре!
Бастер

4
Не існує в Mac OS.
jamescampbell

4
Лол, я щойно прийшов сюди, щоб прокоментувати це і побачив, що моє попереднє «я» прокоментувало це минулого року. Це деякі матриці / початкові матеріали.
jamescampbell

0

Беручи інші відповіді та роблячи версію, яка працює для всіх основних ОС, а також перевіряючи, чи URL-адреса передається як змінна часу виконання:

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

Це може не стосуватися саме того, що ви хочете зробити, але існує справді простий спосіб створити та запустити сервер за допомогою http-serverпакета npm .

Після встановлення (просто npm install http-server -g) ви можете поставити

http-server -o

у вашому bash-скрипті, і він запустить сервер із поточного каталогу та відкриє браузер на цій сторінці.


3
Для цього потрібно npmвстановити + http-serverпакет + запускає непотрібний веб-сервер ...
nicoulaj

1
Якщо ви збираєтеся використовувати npm, існує пакет, який називається open, але він все ще надмірний
Matt Fletcher
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.