Użyj xdg-open, aby otworzyć adres URL z nowym procesem

13

Zaczynam eksperymentować z Crunchbang (opartym na Debianie i używającym terminatora ) jako środowiskiem programistycznym, a jedną z rzeczy, z którą mam problemy, jest zachowanie xdg-open. Pochodzę z OSX, więc wybacz mi, jeśli to pytanie jest tak gęste.

Chciałbym móc otworzyć adres URL, xdg-open http://www.google.coma następnie nadal używać tego samego okna terminala do pracy (tak opendziała w OSX). W tej chwili używanie xdg-openzajmuje bieżącą kartę / sesję, dopóki nie zamknę okna przeglądarki lub nie zakończę ręcznie ctrl + c. Wolałbym, żeby zaczął nowy proces, w ten sposób mogę otworzyć adres URL, odnieść się do danych na stronie i używać go w tej samej karcie / oknie bez konieczności otwierania dodatkowego.

Nick Tomlin
źródło
Z jakiej przeglądarki korzystasz?
Cristian Ciupitu

Odpowiedzi:

12

Dziwne, działa tak po wyjęciu z pudełka na moim Debianie. Spróbuj uruchomić go w tle:

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

Możesz zrobić z tego funkcję, dodając następujące wiersze do swojego ~/.bashrcpliku:

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

Następnie możesz po prostu uruchomić, open http://www.google.coma on będzie działał w tle.

terdon
źródło
1
To działa świetnie. Miałem nadzieję, że będę mieć prosty alias do open(tj. Open = 'xdg-open'). Czy istnieje sposób na uzyskanie funkcjonalności xdg-open <url> &bez używania funkcji powłoki?
Nick Tomlin
@NickTomlin Nie, o ile wiem, nie, ale co masz przeciwko funkcjom? Jak widać w mojej zaktualizowanej odpowiedzi, jest prawie tak prosty jak alias.
terdon
Nie było to szczególnie stronnicze, miałem nadzieję uniknąć tej funkcji, ponieważ próbuję użyć (i ponownie użyć) tego samego aliasu zarówno dla wersji Mac OS, jak i * nix.
Nick Tomlin
Nie ma powodu, dla którego nie mogłeś. Funkcje zależą od powłoki, o ile używasz bash we wszystkich systemach, o których mowa, powinno działać idealnie dobrze.
terdon
Działa to również po wyjęciu z pudełka na Fedorze 20.
Cristian Ciupitu
7

Jeśli chcesz odłączyć proces od bieżącej powłoki zamiast uruchamiać go jako zadanie w tle xdg-open http://www.google.com &, podoba mi się detachnarzędzie:

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

Można do tego stworzyć alias. Podoba mi detachsię, nohupponieważ domyślnie zamyka stdin stdout i stderr, więc jego wywołanie jest czystsze.

Dan D.
źródło
3
Niestety, detachwydaje się , że nie istnieje w mojej dystrybucji. nohupuruchamia proces, ale nadal zajmuje okno terminala.
Nick Tomlin
detachteż nie jest w mojej dystrybucji; ale pyton może obsłużyć otwieranie adresów URL i odłączania: python -m webbrowser -t "http://example.com". Powinno to działać od razu po wyjęciu z pudełka prawie wszystkich nieco nowych dystrybucji Linuksa.
Krets,
Chociaż detachnie ma go nawet w AUR, jego instalacja ze źródła okazała się łatwa, a ponadto był to jedyny program, który osiągnął to, czego chciałem. (alternatywy wymienione tutaj i na detachstronie internetowej nie pozwalają na zamykanie powłoki tak długo, jak xdg-opendziała, lub przynajmniej detachnie spowodowało, że moja skorupa narzekała trochę)
rien333
4

xdg-openczeka na zakończenie programu. To jest z założenia. Jeśli program jest programem tekstowym, musi pozostać na pierwszym planie w terminalu. Nawet jeśli program jest GUI, takie zachowanie jest przydatne w przypadku, gdy xdg-openjest używane ze skryptu, a skrypt chce wykonać coś po edycji pliku (np. Wysłać gdzieś nową wersję lub w inny sposób zrobić coś z nową wersją).

Jeśli nie chcesz czekać, biegnij xdg-openw tle. Możesz uruchomić dowolne polecenie powłoki w tle, umieszczając na końcu znak ampersand.

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

W przypadku niektórych programów xdg-opennatychmiast wraca. W rzeczywistości program, który się xdg-openwywołuje, natychmiast wraca. Zazwyczaj dzieje się tak w przypadku programów GUI, które otwierają wszystkie pliki w jednej instancji: gdy uruchomisz je po raz drugi, wysyłają komunikat do działającej instancji, informując go o otwarciu pliku i natychmiast zamykają działanie.

Gilles „SO- przestań być zły”
źródło
w jaki sposób takie aplikacje implementują zasady pojedynczej instancji? DBus to jeden ze sposobów, który znam, ale czy istnieje sposób „xdg” na wdrożenie tego?
PnotNP,
@NulledPointer Blokuj pliki, komunikaty okien X11, D-Bus,… Przypuszczam, że D-Bus jest „standardowym” sposobem Freedesktop, ale nie wiem, czy istnieje formalna specyfikacja tego.
Gilles „SO- przestań być zły”
2
W moim systemie Ubuntu 16.04 xdg-open zawsze zwraca natychmiast. W mojej obecnej aplikacji wolałbym, żeby się blokowała. Gdzie „xdg-open czeka na zakończenie programu. Jest to zgodne z projektem”. informacje pochodzą?
Charl Botha
@CharlBotha xdg-opennatychmiast wraca (mogę to potwierdzić na Ubuntu 16.04), ale program, który wywołuje, może przejść w tło. Na przykład w moim systemie xdg-openwywołuje Evince dla plików PDF; evince foo.pdfblokuje do momentu zamknięcia pliku PDF, chyba że plik PDF jest już otwarty, w którym to przypadku drugi evinceproces rozpoczęty przez xdg-openskupia istniejącą instancję i kończy działanie. xdg-opennie ma nad tym kontroli, chyba że istnieje sposób, aby program działał poprawnie.
Gilles „SO- przestań być zły”
@Gilles Myślę, że źle zrozumiałeś Charla Bothę. Twoja odpowiedź brzmi: „xdg-open czeka na zakończenie programu. Jest to zgodne z projektem.”. Ale wtedy twój komentarz mówi „xdg-open zwraca natychmiast” ... które są sprzeczne.
cheshirekow
1

Łącząc odpowiedź terdona i dyskusję Dana D. onohup stworzyłem funkcję, która robi dokładnie to, czego chcę:

  1. Otwiera plik w wybranej aplikacji bez żadnego zapisu na terminalu.
  2. Odłącza proces, dzięki czemu można zamknąć okno terminala.
  3. Nie zapisuje żadnych błędów, które aplikacja generuje na terminalu.

Dodałem to do mojego .bashrc/.zshrcpliku:

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

Wyjaśnienie /dev/null 2>&1patrz dyskusja na temat ukrywania stdoutistderr .

LondonRob
źródło
0

Spróbuj tego:

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

Używam tej techniki do umieszczania w kolejce adresów URL magnesu: // do mojego klienta Vuze Bit Torrent.

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

Pojedyncze cudzysłowy pomagają chronić zawartość adresów URL, aby powłoka nie próbowała ich interpretować.

slm
źródło
Nadal utrzymuje proces w bieżącym oknie terminala. Daj mi znać, jeśli będę musiał wyjaśnić moje pytanie.
Nick Tomlin
Tak, jeśli chcesz, aby natychmiast przeszło w tło, po prostu umieść go w tle ze znakiem „&”. Czy to nie jest odpowiedź @ terdon?
slm
Problemem nie jest tutaj xdg-open, patrz odpowiedź @Gilles, wyjaśnia, dlaczego xdg-open jest wstrzymywany, to GUI, do którego wysyłasz adres URL, powoduje, że xdg-open czeka.
slm
Do jakiej przeglądarki wysyłasz adres URL? Czy podczas wysyłania adresów URL w / pojawia się okno dialogowe lub coś innego xdg-open? Wygląda na to, że kilku obecnych tutaj ankieterów wskazało, że normalne zachowanie polega na tym, że kontrola wraca do terminala po pewnym czasie.
slm
Dziękuję za wyjaśnienie. Przejrzałem odpowiedzi i teraz rozumiem to lepiej. Przeglądarka jest łatwa w obsłudze.
Nick Tomlin,
0

Jeśli chcesz otworzyć strony internetowe z linii poleceń (pętli), możesz po prostu otworzyć przeglądarkę przed uruchomieniem skryptu.

W tym przypadku nie czeka na zamknięcie przeglądarki po pierwszym łączu, ale otwiera je wszystkie w nowych kartach.

Valentina Walx
źródło
0

Jak dziś żadna z tych opcji nie działała dla mnie. Jestem w pełni świadomy, że PO powiedział „użyj xdg-open”, z góry przepraszam.

Skończyło się na tym, że robię coś naprawdę prostego chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es.

Jeśli nie masz żadnej z tych 3 przeglądarek, możesz po prostu użyć odpowiednich z własnymi preferencjami.

Uwaga: Firefox otworzył nowe okno bez niczego. Sprawa nie działa dla ciebie szwem, użyj firefox https://google.es -new-instance -new-window. Pamiętaj, że jest to tylko jedna -flaga Floksa.

m3nda
źródło
0

disown jest do tego właściwym poleceniem.

Używam do tego 2 funkcji, aby była bardziej czytelna.

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

x()
{
   f_x "$*" > /dev/null 2>&1
}
użytkownik352672
źródło
Co uważasz, że funkcja, która wywołuje inną funkcję, jest łatwiejsza do odczytania i zrozumienia niż pojedyncza funkcja o długości trzech wierszy?
G-Man mówi „Przywróć Monikę”
disownnie zapobiega wysyłaniu błędów do terminala.
LondonRob