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.
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 exit
name__).
Si vous souhaitez exécuter exit
aprè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
exit
placé à la fin d'un script ne fonctionne pas car il ne fait que quitter l'instance bash
dans laquelle le script est exécuté, qui est une autre instance de bash
que l'instance interne bash
nom__ 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 SIGKILL
au processus parent du script (l'instance bash
liée au terminal). Si une seule instance bash
est liée au terminal, sa suppression entraînera la fermeture de ce dernier. Si plusieurs instances de bash
sont liées au terminal, cette suppression ne provoquera pas la fermeture du terminal.
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 xterm
name __
<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)
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.
exec
.La syntaxe est exec command
, par exemple, exec ./your-script
.
exec
: un exemplePar 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
.)
./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 .
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
Pour répondre explicitement à la question du titre,
"Quitter le terminal après avoir exécuté un script bash":
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.
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"
La solution la plus simple serait:
xdg-open file.pdf && exit
Contrairement à d'autres commandes similaires, Nohup
n'est pas nécessaire pour ignorer SIGHUP
name__, 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é, Nohup
n'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 exit
ferme simplement le terminal.
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