Estoy tratando de escribir un bash
script para abrir ciertos archivos (en su mayoría archivos pdf) usando el gnome-open
comando. También quiero que la terminal salga una vez que abra el archivo pdf.
He intentado agregar exit
al final de mi script, sin embargo, eso no cierra el terminal. Intenté buscar en línea una respuesta a mi pregunta, pero no pude encontrar una adecuada, realmente lo agradecería si ustedes pudieran ayudar.
Necesito una respuesta que solo mate el terminal desde el que ejecuto el comando. No todos los terminales serían posibles. La respuesta anterior que acepté mata todas las ventanas de terminal que están abiertas. No me di cuenta de que este era el caso hasta hoy.
command-line
bash
scripts
Rumesh
fuente
fuente
gnome-open
conxdg-open
en mi script pero no hay cambio. La terminal aún permanece abiertaRespuestas:
Si está abriendo solo un archivo, realmente no necesita usar un script, porque un script está destinado a ser una manera fácil de ejecutar múltiples comandos en una fila, mientras que aquí solo necesita ejecutar dos comandos (incluido
exit
) .Si desea ejecutar
exit
después de un comando o después de una cadena de comandos, puede encadenarlo a lo que ya tiene 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í:
* <path_to_pfd_file> = ruta del archivo pdf
exit
poner al final de un script no funciona porque solo sale de labash
instancia en la que se ejecuta el script, que es otrabash
instancia distinta de labash
instancia interna de la Terminal .Si de todos modos desea utilizar un script, la forma más sencilla es llamarlo de la siguiente manera:
O si el script está en el directorio de trabajo actual de la Terminal de esta manera:
Si realmente no quiere / no puede hacer eso, la segunda forma más directa es agregar esta línea al final de su script:
Esto enviará una
SIGKILL
señal al proceso principal del script (labash
instancia vinculada a la Terminal). Si solo unabash
instancia está vinculada a la Terminal, el hecho de que se elimine hará que la Terminal se cierre. Si hay variasbash
instancias vinculadas a la Terminal, el hecho de que se elimine no hará que la Terminal se cierre sola.fuente
SIGTERM
aquí no es suficiente.Este script termina el terminal y, por lo tanto, el shell y él mismo.
Despiadadamente mata todos los procesos. Si tiene varias pestañas abiertas en una terminal, estas también están cerradas.
El problema es que si se abren varias terminales y estos son procesos hijos de
gnome-terminal-server
, todas las terminales se matarán.En este caso, el script debe iniciarse en un terminal independiente, por ejemplo
xterm
PPID
El PPID es la identificación del proceso padre, en este caso el shell (
e.g. /bin/bash
)PPPID
El PPPID es el ID del proceso padre de PPID, en este caso, la ventana de terminal
<your_command> & disown
En el shell bash, el comando incorporado disown se usa para eliminar trabajos de la tabla de trabajos o para marcar trabajos de modo que no se les envíe una señal SIGHUP si el shell padre lo recibe (por ejemplo, si el usuario cierra sesión).
awk '{print $4}' "/proc/$PPID/stat"
Obtiene el valor de la cuarta columna del archivo
/proc/$PPID/stat
(por ejemplo, para/proc/1/stat
que devuelva 0)fuente
ps xa | grep $$
=>4381 pts/0 Ss 0:01 /usr/bin/zsh
Puedes usar .
exec ./your-script
Un emulador de terminal como GNOME Terminal se cierra cuando el proceso inicial que se ejecuta dentro de él, que generalmente es un shell, se cierra.
Si ya está en un terminal y lo único que desea hacer antes de salir de ese terminal es ejecutar un script (o programa) en particular, entonces esto significa que ya no necesita realmente el shell que se está ejecutando en él. Por lo tanto, puede usar la función
exec
integrada del shell para hacer que el shell se reemplace con el proceso creado por su comando.exec
.La sintaxis es , por ejemplo, .
exec command
exec ./your-script
exec
: un ejemploPor ejemplo, supongamos que tengo un script de shell llamado
count
, ejecutable marcado y ubicado en el directorio actual. Contiene:Y, en una terminal, ejecuto:
Esto imprime los números
5
,4
,3
,2
, y1
, uno por segundo, y entonces se cierra la ventana de terminal.Si ejecuta esto desde algo que no sea el primer proceso ejecutado en su terminal, por ejemplo, si ejecutó
bash
primero para iniciar otra instancia de shell, esto lo lleva de regreso al shell que creó ese proceso, en lugar de salir de la terminal. (Esta advertencia se aplica igualmente a losexit
métodos basados).Puedes usar .
./your-script; exit
Si no desea decirle a su shell que se reemplace con el nuevo proceso (vía
exec
), puede decirle que se quede pero se cierre inmediatamente después de que finalice el nuevo proceso.Para hacer esto, ejecute su comando y el
exit
comando, separados por;
para que se puedan dar en una línea.La sintaxis es
command; exit
, por ejemplo, ../your-script; exit
command; exit
vs.command && exit
Puede notar que esto se parece al método sugerido en las respuestas de kos y heemayl . La diferencia es que:
./your-script && exit
&&
ejecuta el segundo comando solo si el primer comando informó que tuvo éxito al devolver un código de salida de cero.;
ejecuta el segundo comando independientemente de si el primer comando informó o no de éxito.Cuál desea depende de la situación específica. Si el comando falla, ¿desea que el shell de llamada (y el terminal de alojamiento) permanezcan activos? Si es así, use
&&
; si no, úselo;
.También existe
command || exit
, que sale del shell de llamada solo si secommand
informa un error .fuente
Puede obtener su script en lugar de ejecutarlo, por ejemplo
fuente
Personalmente, ejecutaría el comando para abrir pdf u otros archivos en subshell, retrasaría la apertura de los archivos y luego salir. Básicamente, esto es lo que he probado
(nohup gnome-open *.pdf &); sleep 2; exit
La variación en esto sería
nohup gnome-open *.pdf && sleep 2 && exit
fuente
nohup
ignora la señal de colgar,nohup xdg-open some_program
funcionó para mí y noexit
fue necesario.nohup
redirige el mensaje a unnohup.out
archivo:nohup: ignoring input and appending output to nohup.out
La solución más simple sería:
A diferencia de otro comando similar,
nohup
no es necesario hacer que el comando se ignoreSIGHUP
, la razón es que sexdg-open
generará un proceso secundario, que es la aplicación preferida para abrir el archivo pdf. Como el proceso real iniciado desde la terminal ya no está allí para ser eliminado,nohup
no es necesario.&&
indica que el siguiente comando se ejecutará si el comando anterior es exitoso, es decir, devuelve el código de salida0
($?=0
) yexit
simplemente cerrará el terminal.fuente
exit
al final y no funcionó ...exit
dentro del script, lo que no sirve de nada porque tiene el efecto de salir de labash
instancia en la que se ejecuta el script en lugar de labash
instancia principal (la vinculada al Terminal), lo que haría que el Terminal se cerrara en su lugarxdg-open
ya se ejecuta en segundo plano y desvinculado de la Terminal, por lo que no es necesarionohup
aquí, además de lo que entiendo, OP se ejecutaxdg-open
varias veces dentro de un script para abrir por lotes múltiples archivos, usarxdg-open
así dentro del script causaría que el script a la salida de la primeraxdg-open
ocurrenciaxdg-open
en el backgr, incluso si lo hicenohup
es por una razón diferente y debe estar allí ... cualquier proceso en segundo plano desde el terminal de origen se eliminará cuando mates el terminal principal ...nohup
está ahí para evitar es ... como no necesito usar el terminal de forma interactiva de nuevo, no hay necesidad de poner el proceso en bg ... en su segundo punto que también puede evitarse ejecutando cada unoxdg-open && exit
en una subshell ...Para responder explícitamente la pregunta del título,
"Salir del terminal después de ejecutar un script bash" :
Ejecute solo su script en la terminal
Sin mirar los detalles de lo que hace el script, un script se puede ejecutar directamente dentro de un terminal con la opción
-e
(--command
), sin iniciar un shell; se usa en lugar del shell y luego:Use la opción
-x
(--execute
) cuando desee proporcionar argumentos al script. Con esto, solo el resto de la línea de comandos se toma como comando y argumentos.Si su secuencia de comandos se cierra, no hay un shell interactivo que pueda detener nada esperando la entrada del usuario.
Ejemplos
El terminal simplemente saldrá después de que salga el comando que se ejecuta en él, de esta manera, cerrando después de que se
sleep
haya ejecutado 4 segundos, sin shell:Por supuesto, aún puede usar scripts de shell, porque su script está utilizando una instancia de shell diferente de todos modos.
Además, puede ejecutar un shell con un script explícito; no será interactivo:
fuente