Estoy tratando de escribir un bashscript para abrir ciertos archivos (en su mayoría archivos pdf) usando el gnome-opencomando. También quiero que la terminal salga una vez que abra el archivo pdf.
He intentado agregar exital 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-openconxdg-openen 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
exitdespué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
exitponer al final de un script no funciona porque solo sale de labashinstancia en la que se ejecuta el script, que es otrabashinstancia distinta de labashinstancia 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
SIGKILLseñal al proceso principal del script (labashinstancia vinculada a la Terminal). Si solo unabashinstancia está vinculada a la Terminal, el hecho de que se elimine hará que la Terminal se cierre. Si hay variasbashinstancias vinculadas a la Terminal, el hecho de que se elimine no hará que la Terminal se cierre sola.fuente
SIGTERMaquí 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
xtermPPID
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> & disownEn 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/statque devuelva 0)fuente
ps xa | grep $$=>4381 pts/0 Ss 0:01 /usr/bin/zshPuedes usar .
exec ./your-scriptUn 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
execintegrada del shell para hacer que el shell se reemplace con el proceso creado por su comando.exec.La sintaxis es , por ejemplo, .
exec commandexec ./your-scriptexec: 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ó
bashprimero 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 losexitmétodos basados).Puedes usar .
./your-script; exitSi 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
exitcomando, separados por;para que se puedan dar en una línea.La sintaxis es
command; exit, por ejemplo, ../your-script; exitcommand; exitvs.command && exitPuede 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 secommandinforma 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; exitLa variación en esto sería
nohup gnome-open *.pdf && sleep 2 && exitfuente
nohupignora la señal de colgar,nohup xdg-open some_programfuncionó para mí y noexitfue necesario.nohupredirige el mensaje a unnohup.outarchivo:nohup: ignoring input and appending output to nohup.outLa solución más simple sería:
A diferencia de otro comando similar,
nohupno es necesario hacer que el comando se ignoreSIGHUP, la razón es que sexdg-opengenerará 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,nohupno es necesario.&&indica que el siguiente comando se ejecutará si el comando anterior es exitoso, es decir, devuelve el código de salida0($?=0) yexitsimplemente cerrará el terminal.fuente
exital final y no funcionó ...exitdentro del script, lo que no sirve de nada porque tiene el efecto de salir de labashinstancia en la que se ejecuta el script en lugar de labashinstancia principal (la vinculada al Terminal), lo que haría que el Terminal se cerrara en su lugarxdg-openya se ejecuta en segundo plano y desvinculado de la Terminal, por lo que no es necesarionohupaquí, además de lo que entiendo, OP se ejecutaxdg-openvarias veces dentro de un script para abrir por lotes múltiples archivos, usarxdg-openasí dentro del script causaría que el script a la salida de la primeraxdg-openocurrenciaxdg-openen el backgr, incluso si lo hicenohupes 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 ...nohupestá 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 && exiten 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
sleephaya 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