Используйте xdg-open, чтобы открыть URL с новым процессом

13

Я начинаю экспериментировать с Crunchbang (который основан на Debian и использует терминатор ) в качестве среды веб-разработки, и одной из вещей, с которыми я борюсь, является поведение xdg-open. Я пришел из OSX, так что извините, если этот вопрос окажется слишком плотным.

Я хотел бы иметь возможность открыть URL-адрес, xdg-open http://www.google.comа затем продолжать использовать то же окно терминала для работы (это как openфункции в OSX). Прямо сейчас, использование xdg-openзанимает текущую вкладку / сессию, пока я не закрою окно браузера или не завершу вручную ctrl + c. Я бы предпочел, чтобы он запускал новый процесс, чтобы я мог открыть URL-адрес, обратиться к данным на странице и использовать его в той же вкладке / окне без необходимости открывать дополнительный.

Ник Томлин
источник
Какой веб-браузер вы используете?
Кристиан Чиупиту

Ответы:

11

Странно, это работает так из коробки на моем Debian. Попробуйте запустить его в фоновом режиме:

xdg-open http://www.google.com &

Вы можете превратить это в функцию, добавив следующие строки в ваш ~/.bashrcфайл:

function open () {
    xdg-open "$*" &
}

Затем вы можете просто запустить, open http://www.google.comи он будет работать в фоновом режиме.

Тердон
источник
1
Это прекрасно работает. Я надеялся получить простой псевдоним to open(то есть open = 'xdg-open'), есть ли способ получить функциональность xdg-open <url> &без использования функции оболочки?
Ник Томлин
@NickTomlin Не насколько я знаю, нет, но что ты имеешь против функций? Как вы можете видеть в моем обновленном ответе, это почти так же просто, как псевдоним.
Terdon
Не особая предвзятость, я надеялся избежать функции, поскольку я пытаюсь использовать (и повторно использовать) один и тот же псевдоним как для Mac OS, так и для * nix.
Ник Томлин
Нет причин, почему ты не мог. Функции зависят от оболочки, если вы используете bash во всех рассматриваемых системах, она должна работать на отлично.
Тердон
Это работает из коробки на Fedora 20 тоже.
Кристиан Чиупиту
7

Если вы хотите отсоединить процесс от текущей оболочки, а не запускать его как фоновое задание xdg-open http://www.google.com &, мне нравится detachутилита:

detach xdg-open http://www.google.com

Можно создать псевдоним для этого. Мне нравится detachболее, так nohupкак по умолчанию закрывает stdin stdout и stderr, поэтому его вызов будет чище.

Дэн Д.
источник
3
Увы, detachпохоже, не существует в моем дистрибутиве. nohupзапускает процесс, но все еще занимает окно терминала.
Ник Томлин
detachтоже не в моем дистрибутиве; но питон может обрабатывать открытие URL - адресов и отсоединение: python -m webbrowser -t "http://example.com". Это должно работать «из коробки» почти на всех сравнительно недавних дистрибутивах Linux.
Крец
Хотя detachего нет даже в AUR, его оказалось легко установить из исходного кода, и, кроме того, это была единственная программа, которая достигла того, чего я хотел. (альтернативы, перечисленные здесь и на detachвеб-сайте, не позволяют закрывать оболочку, пока xdg-openона работает, или, по крайней мере detach, не заставили мою оболочку жаловаться ни на
секунду
4

xdg-openждет завершения программы Это по замыслу. Если программа является программой текстового режима, она должна оставаться на переднем плане в терминале. Даже если программа с графическим интерфейсом, это поведение полезно в том случае, если xdg-openиспользуется из сценария, и сценарий хочет выполнить что-то после того, как файл был отредактирован (например, отправить новую версию куда-нибудь или иным образом сделать что-то с новой версией).

Если вы не хотите ждать, бегите xdg-openв фоновом режиме. Вы можете запустить любую команду оболочки в фоновом режиме, поставив в конце амперсанд.

xdg-open http://www.google.com &

С некоторыми программами xdg-openвозвращается сразу. На самом деле происходит то, что xdg-openвызывающая программа немедленно возвращается. Обычно это происходит с программами с графическим интерфейсом, которые открывают все файлы в одном экземпляре: когда вы запускаете их второй раз, они посылают сообщение запущенному экземпляру, чтобы сообщить ему об открытии файла, и немедленно завершают работу.

Жиль "ТАК - прекрати быть злым"
источник
как такие приложения реализуют политику одного экземпляра? DBus - один из известных мне способов, но есть ли способ «xdg» реализовать это?
PnotNP
@NulledPointer Lock файлы, сообщения окна X11, D-Bus… Я полагаю, что D-Bus - это «стандартный» способ Freedesktop, но я не знаю, есть ли формальная спецификация для этого.
Жиль "ТАК - перестань быть злым"
2
В моей системе Ubuntu 16.04 xdg-open всегда возвращается немедленно. Для моего текущего приложения я бы предпочел, чтобы оно блокировалось. Где ваш "xdg-open ждет завершения программы. Это сделано специально". информация взялась?
Чарл Бота
@CharlBotha xdg-openнемедленно возвращается (я могу подтвердить это в Ubuntu 16.04), но вызываемая программа может перейти в фоновый режим. Например, в моей системе xdg-openвызывается Evince для файлов PDF; evince foo.pdfблокирует, пока вы не закроете файл PDF, если PDF уже не открыт, и в этом случае второй evinceпроцесс, запущенный путем, xdg-openфокусируется на существующий экземпляр и завершает работу. xdg-openне имеет никакого контроля над этим, если нет способа заставить программу поддерживать работающий процесс.
Жиль "ТАК - перестань быть злым"
@ Жиль, я думаю, ты неправильно понял Чарла Боту. Ваш ответ гласит: «xdg-open ожидает завершения программы. Это сделано специально». Но тогда ваш комментарий говорит: «xdg-open немедленно возвращается» ... что противоречиво.
cheshirekow
1

Объединив ответ Тердона и обсуждение Дэном Д.,nohup я создал функцию, которая делает именно то, что я хочу:

  1. Открывает файл в выбранном приложении без какой-либо записи в терминал.
  2. Отключает процесс, чтобы окно терминала можно было закрыть.
  3. Не пишет ошибок, которые приложение выдает на терминал.

Я добавил это в мой .bashrc/.zshrcфайл:

function open () {
  nohup xdg-open "$*" > /dev/null 2>&1
}

Для объяснения /dev/null 2>&1см. Это обсуждение о сокрытии stdoutиstderr .

LondonRob
источник
0

Попробуй это:

DISPLAY=:0.0; xdg-open '<url>'

Я использую эту технику для постановки в очередь magnet: // URL-адресов в моем клиенте Bit Torrent Vuze.

ssh someserver "DISPLAY=:0.0; xdg-open 'http://www.google.com/'"

Одинарные кавычки помогают защитить содержимое URL-адресов, чтобы оболочка не пыталась их интерпретировать.

SLM
источник
Это по-прежнему поддерживает процесс в текущем окне терминала. Дайте мне знать, если мне нужно уточнить мой вопрос.
Ник Томлин
Да, если вы хотите, чтобы он сразу стал фоновым, просто поместите его на фон с амперсандом "&". Разве это не сказал ответ @ тердона?
SLM
Проблема здесь не в xdg-open, см. Ответ @Gilles, он объясняет, почему задерживается xdg-open, это графический интерфейс, который вы отправляете, URL-адрес которого заставляет xdg-open ждать.
SLM
В какой браузер вы отправляете URL? Есть ли диалоговое окно или что-то еще, когда вы отправляете URL-адреса xdg-open? Похоже, что некоторые из ответивших здесь указали, что нормальным поведением является то, что управление возвращается терминалу через некоторое время.
SLM
благодарю за разъяснение. Я рассмотрел ответы, и теперь я понимаю это лучше. Браузер ледяной.
Ник Томлин
0

Если вам нужно открыть веб-страницы из командной строки (цикл), вы можете просто открыть браузер перед запуском скрипта.

В этом случае он не ожидает закрытия браузера после первой ссылки, а открывает их все в новых вкладках.

Валентина Уолкс
источник
0

Как и сегодня, ни один из этих вариантов не работал для меня. Я полностью осознаю, что ОП сказал "используй xdg-open", извини заранее.

Я закончил тем, что делал по-простому chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es.

Если у вас нет ни одного из этих 3-х браузеров, просто не стесняйтесь использовать правильные с вашим предпочтением порядка.

Примечание. Firefox открыл новое окно, ничего не добавляя. Дело не работает для вас, используйте firefox https://google.es -new-instance -new-window. Обратите внимание, что это только один -для флагов Firefox.

m3nda
источник
0

disown - правильная команда для этого.

Для этого я использую 2 функции, чтобы сделать его более читабельным.

f_x()
{
   xdg-open "$1" &
   disown
}

x()
{
   f_x "$*" > /dev/null 2>&1
}
user352672
источник
Что, вы полагаете, что функцию, вызывающую другую функцию, легче читать и понимать, чем одну функцию длиной три строки?
G-Man говорит: «Восстановите Монику»
disownне предотвращает отправку ошибок в терминал.
LondonRob