web-dev-qa-db-fra.com

Quitter le terminal après avoir exécuté un script bash

J'essaie d'écrire un script bash pour ouvrir certains fichiers (principalement des fichiers pdf) à l'aide de la commande gnome-open. Je souhaite également que le terminal quitte une fois le fichier pdf ouvert.

J'ai essayé d'ajouter exit à la fin de mon script, mais cela ne ferme pas le terminal. J'ai bien essayé de chercher en ligne une réponse à ma question, mais je ne trouvais pas de réponse appropriée, je l'apprécierais vraiment si vous pouviez aider.

J'ai besoin d'une réponse qui ne tue que le terminal à partir duquel je lance la commande. Tous les terminaux ne seraient-ils pas possibles? La réponse précédente, que j’ai acceptée, tue toutes les fenêtres de terminal ouvertes. Je n'avais pas réalisé que c'était le cas jusqu'à aujourd'hui.

16
Rumesh

Si vous ouvrez un seul fichier, vous ne devez pas vraiment utiliser un script, car un script est conçu pour être un moyen facile de s'exécuter. plusieurs commandes à la suite, alors qu’il ne vous reste plus qu’à exécuter deux commandes (dont exitname__).

Si vous souhaitez exécuter exitaprès une commande ou après une chaîne de commandes, vous pouvez le chaîner à ce que vous avez déjà en utilisant l'opérateur && (qui, en cas de succès de la commande/chaîne précédente, exécutera la commande suivante) ou en exécutant la commande suivante. en utilisant l'opérateur ; (qui exécutera la commande suivante en cas d'échec de la commande/chaîne de commandes précédente).

Dans ce cas, ce serait quelque chose comme ça:

gnome-open <path_to_pdf_file> && exit

* <path_to_pfd_file> = chemin du fichier pdf

exitplacé à la fin d'un script ne fonctionne pas car il ne fait que quitter l'instance bashdans laquelle le script est exécuté, qui est une autre instance de bashque l'instance interne bashnom__ du terminal.

De toute façon, si vous voulez utiliser un script, le moyen le plus simple consiste simplement à appeler le script comme suit:

<path_to_script> && exit

Ou si le script se trouve dans le répertoire de travail actuel du terminal, comme suit:

./<script> && exit

Si vous ne voulez vraiment pas , la deuxième méthode la plus simple consiste à ajouter cette ligne à la fin de votre script:

kill -9 $PPID

Ceci enverra un signal SIGKILLau processus parent du script (l'instance bashliée au terminal). Si une seule instance bashest liée au terminal, sa suppression entraînera la fermeture de ce dernier. Si plusieurs instances de bashsont liées au terminal, cette suppression ne provoquera pas la fermeture du terminal.

12
kos

Ce script termine le terminal et donc le shell et lui-même.

Il tue tous les processus sans merci. Si plusieurs onglets sont ouverts dans un terminal, ceux-ci sont également fermés.

Le problème est que si plusieurs terminaux sont ouverts et qu'il s'agit de processus enfants de gnome-terminal-server, tous les terminaux seront tués.

Dans ce cas, le script doit être lancé sur un terminal indépendant, par exemple xtermname __

<your_command> & disown

PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
  • PPID

    Le PPID est l’identifiant du processus parent, dans ce cas le Shell (e.g. /bin/bash)

  • PPPID

    Le PPPID est l’identifiant du processus parent du PPID, dans ce cas, la fenêtre du terminal

  • <your_command> & disown

    Dans le shell bash, la commande intégrée disown est utilisée pour supprimer des travaux de la table des travaux ou pour marquer les travaux de sorte qu'aucun signal SIGHUP ne leur soit envoyé si le shell parent le reçoit (par exemple, si l'utilisateur se déconnecte).

  • awk '{print $4}' "/proc/$PPID/stat"

    Obtient la valeur de la quatrième colonne du fichier /proc/$PPID/stat (par exemple, pour /proc/1/stat, il retourne 0)

4
A.B.

Vous pouvez utiliser exec ./your-script.

Un émulateur de terminal tel que GNOME Terminal se ferme lorsque le processus initial qui s’exécute - ce qui est généralement un shell - s’arrête.

Si vous êtes déjà dans un terminal et que la seule chose que vous voulez faire avant de quitter ce terminal est d'exécuter un script (ou un programme) particulier, cela signifie que vous n'avez plus vraiment besoin du shell qui l'exécute. Ainsi, vous pouvez utiliser la structure exec du shell pour que celui-ci se remplace lui-même par le processus créé par votre commande.

  • Dans le cas de votre script, il s’agit d’un autre processus Shell, tout comme un processus Shell en second est créé lorsque vous exécutez un script sans exec.

La syntaxe est exec command, par exemple, exec ./your-script.

exec: un exemple

Par exemple, supposons que j'ai un script Shell appelé count, marqué comme exécutable et situé dans le répertoire en cours. Il contient:

#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done

Et dans un terminal, je lance:

exec ./count

Ceci affiche les nombres 5, 4, 3, 2 et 1, un par seconde, puis la fenêtre du terminal se ferme.

Si vous exécutez cette opération à partir d'un processus autre que le premier processus exécuté dans votre terminal, par exemple si vous avez d'abord exécuté bash pour démarrer une autre instance de shell, vous revenez alors au shell qui a créé que processus, plutôt que de quitter le terminal. (Cette mise en garde s'applique également aux méthodes basées sur exit.)

Vous pouvez utiliser ./your-script; exit.

Si vous ne voulez pas demander à votre Shell de se remplacer lui-même par le nouveau processus (via exec), vous pouvez lui dire de rester et de se quitter immédiatement après la fin du nouveau processus.

Pour ce faire, exécutez votre commande et la commande exit, séparées par ; afin qu'elles puissent être données sur une seule ligne.

La syntaxe est command; exit, par exemple, ./your-script; exit.

command; exit vs. command && exit

Vous remarquerez peut-être que cela ressemble à la méthode ./your-script&& exit suggérée dans les réponses kos's et heemayl . La différence est que:

  • && exécute la deuxième commande uniquement si la première commande a indiqué qu'elle avait réussi en renvoyant un code de sortie de zéro.
  • ; exécute la deuxième commande, que la première commande ait été couronnée de succès ou non.

Lequel vous voulez dépend de la situation spécifique. Si la commande échoue, voulez-vous que le Shell appelant (et le terminal d'hébergement) reste actif? Si oui, utilisez &&; sinon, utilisez ;.

Il existe également command || exit, qui quitte le shell appelant uniquement si command a signalé un échec .

3
Eliah Kagan

Vous pouvez source votre script au lieu de l'exécuter par exemple

$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close
1
RiaD

Pour répondre explicitement à la question du titre,

"Quitter le terminal après avoir exécuté un script bash":

Exécuter uniquement votre script dans le terminal

Sans examiner en détail le rôle du script, un script peut être exécuté directement dans un terminal avec l'option -e (--command), sans démarrer un shell - il est utilisé à la place du shell, puis:

gnome-terminal -e ./script.sh

Utilisez l'option -x (--execute) lorsque vous souhaitez fournir des arguments au script. Avec cela, tout le reste de la ligne de commande est pris comme commande et comme argument.

gnome-terminal -x ./script.sh foo bar

Si votre script se ferme, aucun shell interactif ne pourrait retarder l'attente de l'utilisateur.

Exemples

Le teminal va simplement quitter après la commande qui s’exécute - comme cela, il se ferme après que sleep ait été exécuté 4 secondes, sans shell:

gnome-terminal -x sleep 4

Bien sûr, vous pouvez toujours utiliser les scripts Shell, car votre script utilise de toute façon une instance Shell différente.

En outre, vous pouvez exécuter un shell avec un script explicite - ce ne sera pas interactif:

gnome-terminal -x bash -c "echo 'Hello!'; sleep 4"
0
Volker Siegel

La solution la plus simple serait:

xdg-open file.pdf && exit

Contrairement à d'autres commandes similaires, Nohupn'est pas nécessaire pour ignorer SIGHUPname__, le motif étant xdg-open qui entraînera la création d'un processus enfant qui est l'application préférée pour ouvrir le fichier pdf. Comme le processus démarré depuis le terminal n'est plus là pour être tué, Nohupn'est pas nécessaire.

&& indique que la prochaine commande sera exécutée si la commande précédente aboutit, c'est-à-dire que je retourne le code de sortie 0 ($?=0) et que exitferme simplement le terminal.

0
heemayl

Personnellement, j'exécuterais la commande pour ouvrir des fichiers pdf ou autres en sous-shell, mettrais un délai pour laisser les fichiers s'ouvrir, puis je quitterais. En gros, voici ce que j'ai testé (Nohup gnome-open *.pdf &); sleep 2; exit

La variation sur ce serait Nohup gnome-open *.pdf && sleep 2 && exit

0