Estoy tratando de escribir un script bash
para abrir ciertos archivos (en su mayoría archivos pdf) utilizando el comando gnome-open
. También quiero que el terminal para salir una vez que se abre el archivo pdf.
He intentado añadir exit
al final de mi script sin embargo eso no cierra la terminal. Traté de buscar en línea una respuesta a mi pregunta, pero no pude encontrar ninguna adecuada, realmente apreciaría si ustedes pudieran ayudar.
Necesito una respuesta que sólo mate la terminal desde la que ejecuto el comando y no todas las terminales, ¿sería esto posible? La respuesta anterior que he aceptado mata todas las ventanas de terminal que están abiertas. No me di cuenta de que este era el caso hasta hoy.
Si sólo está abriendo un archivo, no necesita realmente usar un script, porque un script está pensado para ser una forma fácil de ejecutar múltiples comandos seguidos, mientras que aquí sólo necesita ejecutar dos comandos (incluyendo exit
).
Si quieres ejecutar exit
después de un comando o después de una cadena de comandos, puedes encadenarlo a lo que ya tienes usando el operador &&
(que en caso de éxito del comando / cadena de comandos anterior ejecutará el siguiente comando) o usando el operador ;
(que tanto en caso de éxito como en caso de fallo del comando / cadena de comandos anterior ejecutará el siguiente comando).
En este caso sería algo así:
gnome-open <path_to_pdf_file> && exit
*<path_to_pfd_file> = ruta del archivo pdf
exit
puesto al final de un script no'funciona porque sólo sale de la instancia bash
en la que se ejecuta el script, que es otra instancia bash
que la instancia bash
interna del Terminal's.
Si quieres usar un script de todas formas, la forma más directa es llamar al script de esta forma:
<path_to_script> && exit
O si el script está en el directorio de trabajo actual de la Terminal, así:
./<script> && exit
Si usted realmente no quiere / no puede hacer eso, la segunda forma más sencilla es añadir esta línea al final de su script:
kill -9 $PPID
Esto enviará una señal SIGKILL
al proceso padre del script (la instancia bash
vinculada al Terminal). Si sólo una instancia de bash
está enlazada a la Terminal, al matarla se cerrará la Terminal. Si múltiples instancias bash
están enlazadas a la Terminal, la muerte de la instancia bash
no causará que la Terminal se cierre.
Este script termina el terminal y por lo tanto el shell y a sí mismo.
Mata sin piedad todos los procesos. Si tiene varias pestañas abiertas en un terminal, entonces estas también se cierran.
*El problema es que si hay varios terminales abiertos y estos son procesos hijos de gnome-terminal-server
, todos los terminales serán eliminados.
En este caso, el script debería iniciarse en un terminal independiente, por ejemplo xterm
.
<your_command> & disown
PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
El PPID es el id del proceso padre, en este caso el shell (e.g. /bin/bash
)
El PPPID es el identificador del proceso padre del PPID, en este caso, la ventana del terminal.
<tu_comando> & disown
En el shell bash, el comando incorporado disown se utiliza para eliminar trabajos de la tabla de trabajos, o para marcar trabajos de forma que no se les envíe una señal SIGHUP si el shell padre la recibe (por ejemplo, si el usuario cierra la sesión).
awk '{print $4}' "/proc/$PPID/stat"
Obtiene el valor de la cuarta columna del fichero /proc/$PPID/stat
(p.e. para /proc/1/stat
devuelve 0)
La solución más sencilla sería:
xdg-open file.pdf && exit
A diferencia de otros comandos similares nohup
no es necesario para hacer que el comando ignore SIGHUP
, la razón es que xdg-open
saldrá generando un proceso hijo que es la aplicación preferida para abrir el fichero pdf. Como el proceso iniciado desde el terminal ya no está ahí para ser eliminado, nohup
no es necesario.
&&indica que el siguiente comando se ejecutará si el comando anterior tiene éxito, es decir, devuelve el código de salida
0(
$?=0) y
exit` simplemente cerrará la terminal.