Використовуйте xdg-open, щоб відкрити URL-адресу з новим процесом


13

Я починаю експериментувати з Crunchbang (який заснований на Debian і використовує термінатор ) як середовище веб-розробки, і одна з речей, з якими я боюся, - це поведінка xdg-open. Я походжу з OSX, тому вибачте мене, якщо це питання вийде як густе.

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


Який веб-браузер ви використовуєте?
Крістіан Цюпіту

Відповіді:


12

Як не дивно, він працює так, як ящик на моєму Debian. Спробуйте запустити його у фоновому режимі:

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

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

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

Потім можна просто запустити, open http://www.google.comі він буде працювати у фоновому режимі.


1
Це чудово працює. Я сподівався мати простий псевдонім до open(тобто open = 'xdg-open') Чи є спосіб отримати функціональність xdg-open <url> &без використання функції оболонки?
Нік Томлін

@NickTomlin Не наскільки я знаю, ні, але що ти маєш проти функцій? Як ви бачите в моїй оновленій відповіді, це майже так само просто, як псевдонім.
тердон

Я не сподівався на те, щоб уникнути функції, оскільки я намагаюся використовувати (і повторно використовувати) той самий псевдонім для Mac OS і * nix ароматів.
Нік Томлін

Ні з якої причини ви не могли. Функції залежать від оболонки, якщо ви використовуєте bash у всіх розглянутих системах, він повинен працювати ідеально.
тердон

Це працює і поза Fedora 20.
Крістіан Цюпіту

7

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

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

Можна створити псевдонім для цього. Мені подобається detachбільше , nohupяк замикає STDIN стандартний висновок і стандартний потік помилок за замовчуванням , тому його виклик чистіше.


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викликає, повертається негайно. Зазвичай це відбувається з програмами GUI, які відкривають усі файли в одному екземплярі: коли ви запускаєте їх вдруге, вони надсилають повідомлення запущеному екземпляру, щоб сказати йому відкрити файл і негайно вийти.


як такі програми реалізують політику одного примірника? DBus - це один із способів, про які я знаю, але чи існує "xdg" спосіб реалізації цього?
PnotNP

Файли блокування @NulledPointer, повідомлення вікон 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не має контролю над цим, якщо тільки не існує способу змусити програму продовжувати працювати.
Жил "ТАК - перестань бути злим"

@Gilles Я думаю, ти неправильно зрозумів Чарл Бота. У вашій відповіді зазначено "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>'

Я використовую цю техніку, щоб ввести в чергу магніт: // URL-адреси в мій клієнт Bit Torrent Vuze.

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

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


Це все ще підтримує процес у поточному вікні терміналу. Повідомте мене, якщо мені потрібно уточнити своє питання.
Нік Томлін

Так, якщо ви хочете, щоб він негайно перейшов у фоновий режим, тоді просто поставте його на другий план за допомогою символу "&". Хіба це не відповідь @ terdon?
slm

Проблема тут не xdg-open, див. Відповідь @Gilles, він пояснює, чому xdg-open затримується, це графічний інтерфейс, на який ви надсилаєте URL, змушує xdg-open чекати.
slm

До якого браузера ви надсилаєте URL-адресу? Чи з'являється діалогове вікно чи щось інше, коли ви надсилаєте URL-адреси w / xdg-open? Схоже, декілька тут відповіли вказували на те, що нормальна поведінка полягає в тому, що контроль повертається до терміналу через деякий проміжок часу.
slm

дякую за роз’яснення Я переглянув відповіді і зараз це краще розумію. Браузер - Iceweasal.
Нік Томлін

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.