Используйте 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 .


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

Проблема здесь не в 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.


0

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

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

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

x()
{
   f_x "$*" > /dev/null 2>&1
}

Что, вы полагаете, что функцию, вызывающую другую функцию, легче читать и понимать, чем одну функцию длиной три строки?
— G-Man говорит: «Восстановите Монику»

disownне предотвращает отправку ошибок в терминал.
— LondonRob
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.