Use xdg-open para abrir una url con un nuevo proceso


13

Estoy empezando a experimentar con Crunchbang (que se basa en Debian y usa Terminator ) como un entorno de desarrollo web, y una de las cosas con las que estoy luchando es el comportamiento xdg-open. Vengo de un entorno OSX, así que perdóname si esta pregunta resulta ser densa.

Me gustaría poder abrir una url xdg-open http://www.google.comy luego seguir usando la misma ventana de terminal para trabajar (así es como openfunciona en OSX). En este momento, el uso xdg-openocupa la pestaña / sesión actual hasta que cierre la ventana del navegador, o finalice manualmente las cosas con ctrl + c. Prefiero que comience un nuevo proceso, de esa manera puedo abrir una URL, consultar los datos en la página y usarla en la misma pestaña / ventana sin necesidad de abrir una adicional.


¿Qué navegador web estás usando?
Cristian Ciupitu

Respuestas:


11

Extraño, funciona así de fábrica en mi Debian. Intenta ejecutarlo en segundo plano:

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

Puede convertir esto en una función agregando estas líneas a su ~/.bashrcarchivo:

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

Luego puede simplemente ejecutar open http://www.google.comy se ejecutará en segundo plano.


1
Esto funciona muy bien. Esperaba tener un alias simple para to open, (ie open = 'xdg-open') ¿hay alguna manera de obtener la funcionalidad xdg-open <url> &sin usar una función de shell?
Nick Tomlin

@NickTomlin No que yo sepa, no, pero ¿qué tienes contra las funciones? Como puede ver en mi respuesta actualizada, es casi tan simple como un alias.
terdon

No es un sesgo en particular, esperaba evitar una función ya que estoy tratando de usar (y reutilizar) el mismo alias para Mac OS y * nix.
Nick Tomlin

No hay razón por la que no puedas. Las funciones dependen del shell, siempre que use bash en todos los sistemas en cuestión, debería funcionar perfectamente bien.
terdon

Funciona de fábrica en Fedora 20 también.
Cristian Ciupitu

7

Si desea separar el proceso del shell actual en lugar de comenzarlo como un trabajo en segundo plano xdg-open http://www.google.com &, me gusta la detachutilidad:

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

Se podría crear un alias para esto. Me gusta detachmás nohupcomo se cierra stdin stdout y stderr de forma predeterminada para su invocación es más limpio.


3
Por desgracia, detachno parece existir en mi distribución. nohupinicia el proceso, pero aún ocupa la ventana de terminal.
Nick Tomlin

detachtampoco está en mi distribución; pero pitón puede manejar la apertura de URLs y separar: python -m webbrowser -t "http://example.com". Esto debería funcionar de forma inmediata en casi todas las distribuciones de Linux algo recientes.
Krets

Aunque detachni siquiera está en el AUR, resultó fácil de instalar desde la fuente y, además, fue el único programa que logró lo que quería. (las alternativas enumeradas aquí y en el detachsitio web no permiten cerrar el shell mientras se xdg-openestá ejecutando, o al menos detachno hicieron que mi shell se quejara un poco)
rien333

4

xdg-openespera a que termine el programa. Esto es por diseño. Si el programa es un modo de texto, debe permanecer en primer plano en el terminal. Incluso si el programa es una GUI, este comportamiento es útil en caso de que xdg-opense use desde un script y el script quiera realizar algo después de que el archivo haya sido editado (por ejemplo, envíe la nueva versión a algún lugar o haga algo con la nueva versión).

Si no quieres esperar, corre xdg-openen segundo plano. Puede ejecutar cualquier comando de shell en segundo plano colocando un ampersand al final.

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

Con algunos programas, xdg-openregresa de inmediato. Lo que sucede es que el programa que xdg-openinvoca regresa de inmediato. Esto suele suceder con los programas GUI que abren todos los archivos en una sola instancia: cuando los inicia por segunda vez, envían un mensaje a la instancia en ejecución para indicarle que abra el archivo y salgan inmediatamente.


¿Cómo implementan dichas aplicaciones la política de instancia única? DBus es una forma que conozco, pero ¿hay una forma 'xdg' de implementar esto?
PnotNP

@NulledPointer Lock files, X11 window messages, D-Bus, ... Supongo que D-Bus es la forma "estándar" de Freedesktop, pero no sé si hay una especificación formal para esto.
Gilles 'SO- deja de ser malvado'

2
En mi sistema Ubuntu 16.04, xdg-open siempre regresa inmediatamente. Para mi aplicación actual, preferiría que bloquee. ¿Dónde espera su "xdg-open para que el programa termine? Esto es por diseño". la información proviene?
Charl Botha

@CharlBotha xdg-openregresa de inmediato (puedo confirmar eso en Ubuntu 16.04), pero el programa que invoca puede pasar a un segundo plano. Por ejemplo, en mi sistema, xdg-openinvoca Evince para archivos PDF; evince foo.pdfbloquea hasta que cierre el archivo PDF, a menos que el PDF ya esté abierto, en cuyo caso el segundo evinceproceso iniciado por xdg-openenfoca la instancia existente y sale. xdg-openno tiene control sobre eso, a menos que haya una manera de hacer que el programa mantenga un proceso en ejecución.
Gilles 'SO- deja de ser malvado'

@Gilles Creo que entendiste mal a Charl Botha. Su respuesta dice "xdg-open espera a que el programa termine. Esto es por diseño". Pero luego su comentario dice "xdg-open devuelve inmediatamente" ... lo cual es contradictorio.
cheshirekow

1

Al combinar la respuesta de terdon y la discusión de Dan D. sobrenohup yo, creé una función que hace exactamente lo que quiero:

  1. Abre el archivo en la aplicación elegida sin escribir nada en el terminal.
  2. Separa el proceso para que se pueda cerrar la ventana del terminal.
  3. No escribe ningún error que la aplicación produce en el terminal.

Agregué esto a mi .bashrc/.zshrcarchivo:

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

Para una explicación de /dev/null 2>&1ver esta discusión sobre esconderse stdoutystderr .


0

Prueba esto:

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

Utilizo esta técnica para poner en cola magnet: // URL en mi cliente de Bit Torrent Vuze.

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

Las comillas simples ayudan a proteger el contenido de las URL para que el shell no intente interpretarlas.


Esto todavía mantiene el proceso ejecutándose en la ventana de terminal actual. Avíseme si necesito aclarar mi pregunta.
Nick Tomlin

Sí, si quieres que pase a segundo plano inmediatamente, simplemente ponlo en segundo plano con un signo "&". ¿No se dice que la respuesta de @terdon dice que hacer?
slm

El problema aquí no es xdg-open, vea la respuesta de @Gilles, él explica por qué se está reteniendo xdg-open, es la GUI a la que está enviando la URL lo que hace que xdg-open espere.
slm

¿A qué navegador está enviando la URL? ¿Hay un cuadro de diálogo o algo más que aparece cuando envía las URL con xdg-open? Parece que varios de los que respondieron aquí han indicado que el comportamiento normal es que el control se devuelve al terminal después de un período de tiempo.
slm

gracias por la aclaración. He revisado las respuestas y ahora entiendo esto mejor. El navegador es iceweasal.
Nick Tomlin

0

Si necesita abrir páginas web desde la línea de comandos (bucle), puede abrir el navegador antes de iniciar el script.

En este caso, no espera a que se cierre el navegador después del primer enlace, sino que los abre a todos en nuevas pestañas.


0

Como hoy, ninguna de esas opciones funcionó para mí. Soy totalmente consciente de que el OP dijo "use xdg-open", lo siento de antemano.

Terminé haciendo un simple muerto chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es.

Si no tiene ninguno de esos 3 navegadores, no dude en usar los correctos con su preferencia de orden.

Nota: Firefox abrió una nueva ventana sin agregar nada. El estuche no funciona mal para ti, úsalo firefox https://google.es -new-instance -new-window. Tenga en cuenta que es solo uno -para las banderas de Firefox.


0

Desown es el comando correcto para esto.

Utilizo 2 funciones para esto, para mantenerlo más legible.

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

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

¿Qué, usted cree que una función que llama a otra función es más fácil de leer y comprender que una sola función que tiene tres líneas de largo?
G-Man dice 'Reincorporar a Monica'

disownno evita que se envíen errores al terminal.
LondonRob
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.