Utilisez xdg-open pour ouvrir une URL avec un nouveau processus


13

Je commence à expérimenter avec Crunchbang (qui est basé sur Debian et utilise Terminator ) comme environnement de développement Web, et l'une des choses avec lesquelles je lutte est le comportement de xdg-open. Je viens d'un arrière-plan OSX, alors pardonnez-moi si cette question se révèle aussi dense.

Je voudrais pouvoir ouvrir une URL avec xdg-open http://www.google.compuis continuer à utiliser la même fenêtre de terminal pour travailler (c'est comme ça que openfonctionne dans OSX). À l'heure actuelle, l'utilisation xdg-openoccupe l'onglet / la session en cours jusqu'à ce que je ferme la fenêtre du navigateur ou que je termine manuellement les choses avec ctrl + c. Je préférerais de beaucoup qu'il démarre un nouveau processus, de cette façon, je peux ouvrir une URL, faire référence aux données sur la page et l'utiliser dans le même onglet / fenêtre sans avoir besoin d'en ouvrir un autre.


Quel navigateur Web utilisez-vous?
Cristian Ciupitu

Réponses:


11

Étrange, cela fonctionne comme ça hors de la boîte sur mon Debian. Essayez de l'exécuter en arrière-plan:

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

Vous pouvez en faire une fonction en ajoutant ces lignes à votre ~/.bashrcfichier:

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

Vous pouvez ensuite simplement exécuter open http://www.google.comet il s'exécutera en arrière-plan.


1
Cela fonctionne très bien. J'espérais avoir un alias simple pour to open, (ie open = 'xdg-open') y a-t-il un moyen d'obtenir la fonctionnalité de xdg-open <url> &sans utiliser de fonction shell?
Nick Tomlin

@NickTomlin Pas autant que je sache, non, mais qu'avez-vous contre les fonctions? Comme vous pouvez le voir dans ma réponse mise à jour, c'est presque aussi simple qu'un alias.
terdon

Pas un biais particulier, j'espérais éviter une fonction car j'essaie d'utiliser (et de réutiliser) le même alias pour les versions Mac OS et * nix.
Nick Tomlin

Aucune raison pour laquelle vous ne pouviez pas. Les fonctions dépendent du shell, tant que vous utilisez bash dans tous les systèmes en question, il devrait parfaitement fonctionner.
terdon

Cela fonctionne également sur Fedora 20.
Cristian Ciupitu

7

Si vous souhaitez détacher le processus du shell actuel plutôt que de le démarrer en tâche de fond avec xdg-open http://www.google.com &, j'aime l' detachutilitaire:

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

On pourrait créer un alias pour cela. J'aime detachplus nohupque ferme stdin stdout et stderr par défaut donc son invocation est plus propre.


3
Hélas, detachne semble pas exister dans ma distribution. nohuplance le processus, mais occupe toujours la fenêtre du terminal.
Nick Tomlin

detachn'est pas non plus dans ma distribution; mais python peut gérer l' ouverture des URL et détacher: python -m webbrowser -t "http://example.com". Cela devrait fonctionner dès le départ sur presque toutes les distributions quelque peu récentes de Linux.
Krets

Bien qu'il detachne soit même pas dans l'AUR, il s'est avéré facile à installer à partir de la source et était en outre le seul programme qui a atteint ce que je voulais. (les alternatives répertoriées ici et sur le detachsite Web ne permettent pas de fermer le shell tant qu'il xdg-openest en cours d'exécution, ou du moins detachn'ont pas fait me plaindre mon shell)
rien333

4

xdg-openattend la fin du programme. C'est par conception. Si le programme est un programme en mode texte, il doit rester au premier plan dans le terminal. Même si le programme est une interface graphique, ce comportement est utile dans le cas où il xdg-openest utilisé à partir d'un script et que le script souhaite effectuer quelque chose après que le fichier a été modifié (par exemple, envoyer la nouvelle version quelque part ou faire quelque chose avec la nouvelle version).

Si vous ne voulez pas attendre, lancez-vous xdg-openen arrière-plan. Vous pouvez exécuter n'importe quelle commande shell en arrière-plan en mettant une esperluette à la fin.

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

Avec certains programmes, xdg-openrevient immédiatement. Ce qui se passe, c'est que le programme qui xdg-openinvoque revient immédiatement. Cela se produit généralement avec les programmes GUI qui ouvrent tous les fichiers dans une seule instance: lorsque vous les démarrez une deuxième fois, ils envoient un message à l'instance en cours d'exécution pour lui dire d'ouvrir le fichier et de quitter immédiatement.


comment ces applications mettent-elles en œuvre une stratégie d'instance unique? DBus est un moyen que je connais, mais existe-t-il un moyen 'xdg' de l'implémenter?
PnotNP

@NulledPointer Lock fichiers, messages de fenêtre X11, D-Bus,… Je suppose que D-Bus est le moyen «standard» de Freedesktop mais je ne sais pas s'il existe une spécification formelle pour cela.
Gilles 'SO- arrête d'être méchant'

2
Sur mon système Ubuntu 16.04, xdg-open revient toujours immédiatement. Pour mon application actuelle, je préférerais en fait qu'elle bloque. Où votre "xdg-open attend la fin du programme. C'est par conception." l'information vient-elle?
Charl Botha

@CharlBotha xdg-openrevient immédiatement (je peux le confirmer sur Ubuntu 16.04), mais le programme qu'il appelle peut passer en arrière-plan. Par exemple, sur mon système, xdg-openappelle Evince pour les fichiers PDF; evince foo.pdfbloque jusqu'à ce que vous fermiez le fichier PDF, sauf si le PDF est déjà ouvert, auquel cas le deuxième evinceprocessus démarré par xdg-openconcentre l'instance existante et se ferme. xdg-openn'a aucun contrôle sur cela, à moins qu'il n'y ait un moyen de faire en sorte que le programme garde un processus en cours.
Gilles 'SO- arrête d'être méchant'

@Gilles Je pense que vous avez mal compris Charl Botha. Votre réponse indique «xdg-open attend la fin du programme. Ceci est voulu par la conception même du produit». Mais alors votre commentaire dit "xdg-open revient immédiatement" ... qui sont contradictoires.
cheshirekow

1

En combinant la réponse de terdon et la discussion de Dan D. surnohup j'ai créé une fonction qui fait exactement ce que je veux:

  1. Ouvre le fichier dans l'application choisie sans aucune écriture sur le terminal.
  2. Détache le processus afin que la fenêtre du terminal puisse être fermée.
  3. N'écrit aucune erreur générée par l'application sur le terminal.

J'ai ajouté ceci à mon .bashrc/.zshrcdossier:

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

Pour une explication de /dev/null 2>&1voir cette discussion sur la dissimulation stdoutetstderr .


0

Essaye ça:

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

J'utilise cette technique pour mettre en file d'attente les URL magnet: // dans mon client Bit Torrent Vuze.

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

Les guillemets simples aident à protéger le contenu des URL afin que le shell ne tente pas de les interpréter.


Cela maintient toujours le processus en cours d'exécution dans la fenêtre de terminal actuelle. Faites-moi savoir si j'ai besoin de clarifier ma question.
Nick Tomlin

Oui, si vous voulez qu'il passe en arrière-plan immédiatement, mettez-le simplement en arrière-plan avec une esperluette "&". N'est-ce pas la réponse de @ terdon qui est censée faire?
slm

Le problème ici n'est pas xdg-open, voir la réponse de @Gilles, il explique pourquoi xdg-open est bloqué, c'est l'interface graphique à laquelle vous envoyez l'URL à laquelle xdg-open attend.
slm

À quel navigateur envoyez-vous l'URL? Y a-t-il une boîte de dialogue ou autre chose qui apparaît lorsque vous envoyez les URL avec xdg-open? Il semble que plusieurs des répondants ici ont indiqué que le comportement normal est que le contrôle est retourné au terminal après un certain temps.
slm

Merci pour la clarification. J'ai passé en revue les réponses et je comprends mieux maintenant. Le navigateur est iceweasal.
Nick Tomlin

0

Si vous devez ouvrir des pages Web à partir de la ligne de commande (boucle), vous pouvez simplement ouvrir le navigateur avant de démarrer le script.

Dans ce cas, il n'attend pas la fermeture du navigateur après le premier lien, mais les ouvre tous dans de nouveaux onglets.


0

Comme aujourd'hui, aucune de ces options n'a fonctionné pour moi. Je suis parfaitement conscient que l'OP a dit "utiliser xdg-open", désolé à l'avance.

J'ai fini par faire un simple mort chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es.

Si vous n'avez aucun de ces 3 navigateurs, n'hésitez pas à utiliser les bons avec votre préférence de commande.

Remarque: Firefox a ouvert une nouvelle fenêtre sans rien ajouter. Le cas ne fonctionne pas parfaitement pour vous, utilisez firefox https://google.es -new-instance -new-window. Notez que ce n'est qu'un -pour les drapeaux Firefox.


0

désavouer est la bonne commande pour cela.

J'utilise 2 fonctions pour cela, afin de le garder plus lisible.

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

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

Quoi, vous croyez qu'une fonction qui appelle une autre fonction est plus facile à lire et à comprendre qu'une seule fonction de trois lignes?
G-Man dit `` Réintègre Monica ''

disownn'empêche pas l'envoi d'erreurs au terminal.
LondonRob
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.