Usa xdg-open per aprire un URL con un nuovo processo


13

Sto iniziando a sperimentare Crunchbang (che è basato su Debian e usa terminator ) come ambiente di sviluppo web, e una delle cose con cui sto lottando è il comportamento xdg-open. Vengo da un background OSX, quindi perdonami se questa domanda si presenta densa.

Vorrei essere in grado di aprire un URL con xdg-open http://www.google.come quindi continuare a utilizzare la stessa finestra del terminale per funzionare (è come openfunziona in OSX). In questo momento, l'utilizzo xdg-openoccupa la scheda / sessione corrente fino alla chiusura della finestra del browser o alla fine manuale delle cose ctrl + c. Preferirei di gran lunga iniziare un nuovo processo, in questo modo posso aprire un URL, fare riferimento ai dati nella pagina e usarlo nella stessa scheda / finestra senza bisogno di aprirne uno aggiuntivo.


Quale browser web stai usando?
Cristian Ciupitu,

Risposte:


11

Strano, funziona così fuori dal mio Debian. Prova a eseguirlo in background:

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

Puoi trasformarlo in una funzione aggiungendo queste righe al tuo ~/.bashrcfile:

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

È quindi possibile semplicemente eseguire open http://www.google.come verrà eseguito in background.


1
Funziona benissimo. Speravo di avere un semplice alias da open(cioè open = 'xdg-open') c'è un modo per ottenere la funzionalità xdg-open <url> &senza usare una funzione shell?
Nick Tomlin,

@NickTomlin Non per quanto ne so, no, ma cosa hai contro le funzioni? Come puoi vedere nella mia risposta aggiornata, è quasi semplice come un alias.
terdon

Non un particolare pregiudizio, speravo di evitare una funzione poiché sto cercando di usare (e riutilizzare) lo stesso alias sia per Mac OS che per * nix.
Nick Tomlin,

Nessun motivo per cui non puoi. Le funzioni dipendono dalla shell, purché si usi bash in tutti i sistemi in questione, dovrebbe funzionare perfettamente.
terdon

Funziona anche su Fedora 20.
Cristian Ciupitu,

7

Se si desidera staccare il processo dalla shell corrente anziché avviarlo come processo in background xdg-open http://www.google.com &, mi piace l' detachutilità:

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

Si potrebbe creare un alias per questo. Mi piace detacholtre nohupcome chiude stdin stdout e stderr di default, quindi la sua invocazione è più pulita.


3
Purtroppo, detachnon sembra esistere nella mia distribuzione. nohupavvia il processo, ma occupa ancora la finestra del terminale.
Nick Tomlin,

detachnon è nemmeno nella mia distribuzione; ma pitone può gestire l'apertura delle URL e distacco: python -m webbrowser -t "http://example.com". Questo dovrebbe funzionare immediatamente su quasi tutte le distro di Linux un po 'recenti.
Krets

Sebbene detachnon sia nemmeno nell'AUR, è stato facile installarlo dalla fonte e inoltre era l'unico programma che ha ottenuto ciò che desideravo. (le alternative elencate qui e sul detachsito Web non consentono di chiudere la shell finché xdg-openè in esecuzione, o almeno detachnon mi sono lamentato un po 'della shell)
rien333

4

xdg-openattende che il programma finisca. Questo è di progettazione. Se il programma è un programma in modalità testo, deve rimanere in primo piano nel terminale. Anche se il programma è una GUI, questo comportamento è utile nel caso in cui xdg-openvenga utilizzato da uno script e lo script vuole eseguire qualcosa dopo che il file è stato modificato (ad esempio, inviare la nuova versione da qualche parte o creare qualcosa con la nuova versione).

Se non vuoi aspettare, esegui xdg-openin background. È possibile eseguire qualsiasi comando di shell in background mettendo una e commerciale alla fine.

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

Con alcuni programmi, xdg-openritorna immediatamente. Quello che succede è in realtà che il programma che xdg-openinvoca ritorna immediatamente. Questo in genere accade con i programmi GUI che aprono tutti i file in una singola istanza: quando li avvii una seconda volta, inviano un messaggio all'istanza in esecuzione per dirgli di aprire il file e uscire immediatamente.


in che modo tali applicazioni implementano criteri a istanza singola? DBus è un modo che conosco ma esiste un modo 'xdg' di implementarlo?
PnotNP

@NulledPointer Lock files, X11 window windows, D-Bus, ... Suppongo che D-Bus sia il modo "standard" di Freedesktop ma non so se ci siano specifiche formali per questo.
Gilles 'SO-smetti di essere malvagio' il

2
Sul mio sistema Ubuntu 16.04, xdg-open ritorna sempre immediatamente. Per la mia attuale applicazione, preferirei che si blocchi. Da dove viene il tuo "xdg-open attende che il programma finisca. Questo è in base alla progettazione." le informazioni provengono da?
Charl Botha,

@CharlBotha xdg-openritorna immediatamente (posso confermarlo su Ubuntu 16.04), ma il programma che invoca potrebbe spostarsi in background. Ad esempio, sul mio sistema, xdg-openinvoca Evince per i file PDF; evince foo.pdfsi blocca fino alla chiusura del file PDF, a meno che il PDF non sia già aperto, nel qual caso il secondo evinceprocesso avviato xdg-openfocalizza l'istanza esistente ed esce. xdg-opennon ha alcun controllo su questo, a meno che non ci sia un modo per fare in modo che il programma mantenga un processo in esecuzione.
Gilles 'SO- smetti di essere malvagio' il

@Gilles Penso che tu abbia frainteso Charl Botha. La tua risposta afferma "xdg-open attende che il programma finisca. Questo è in base alla progettazione". Ma poi il tuo commento dice "xdg-open restituisce immediatamente" ... che sono contraddittori.
Cheshirekow,

1

Combinando la risposta di Terdon e la discussione di Dan D. sunohup ho creato una funzione che fa esattamente quello che voglio:

  1. Apre il file in app prescelta, senza alcuna scrittura al terminale a tutti.
  2. Stacca il processo in modo che la finestra del terminale possa essere chiusa.
  3. Non scrive alcun errore che l'app produce sul terminale.

Ho aggiunto questo al mio .bashrc/.zshrcfile:

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

Per una spiegazione di /dev/null 2>&1vedere questa discussione sul nascondersi stdoutestderr .


0

Prova questo:

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

Uso questa tecnica per mettere in coda i magnet: // URL nel mio client Bit Torrent Vuze.

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

Le virgolette singole aiutano a proteggere il contenuto degli URL in modo che la shell non tenti di interpretarli.


Ciò mantiene il processo in esecuzione nella finestra del terminale corrente. Fammi sapere se devo chiarire la mia domanda.
Nick Tomlin

Sì, se vuoi che diventi immediatamente in background, mettilo sullo sfondo con una e commerciale "&". Quella risposta di @ terdon non è detta?
slm

Il problema qui non è xdg-open, vedi la risposta di @Gilles, spiega perché xdg-open viene trattenuto, è la GUI a cui stai inviando l'URL che sta causando l'attesa di xdg-open.
slm

A quale browser stai inviando l'URL? C'è una finestra di dialogo o qualcos'altro che viene visualizzato quando invii gli URL con xdg-open? Sembra che molti dei rispondenti qui abbiano indicato che il comportamento normale è che il controllo viene restituito al terminale dopo un certo periodo di tempo.
slm

grazie per il chiarimento. Ho esaminato le risposte e ora lo capisco meglio. Il browser è iceweasal.
Nick Tomlin,

0

Se è necessario aprire pagine Web dalla riga di comando (loop), è sufficiente aprire il browser prima di avviare lo script.

In questo caso, non attende la chiusura del browser dopo il primo collegamento, ma li apre tutti in nuove schede.


0

Come oggi, nessuna di queste opzioni ha funzionato per me. Sono pienamente consapevole che l'OP ha detto "usa xdg-open", scusa in anticipo.

Ho finito per fare un semplicissimo chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es.

Se non hai nessuno di questi 3 browser, sentiti libero di usare quelli giusti con le tue preferenze di ordine.

Nota: Firefox ha aperto una nuova finestra senza aggiungere nulla. Il caso non funziona perfettamente per te, usa firefox https://google.es -new-instance -new-window. Si noti che è solo uno -per le bandiere di Firefox.


0

disown è il comando giusto per questo.

Uso 2 funzioni per questo, al fine di renderlo più leggibile.

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

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

Cosa, credi che una funzione che chiama un'altra funzione sia più facile da leggere e capire di una singola funzione lunga tre righe?
G-Man dice "Reinstate Monica"

disownnon impedisce l'invio di errori al terminale.
Londra,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.