J'essaie d'écrire un bash
script pour ouvrir certains fichiers (principalement des fichiers pdf) en utilisant la gnome-open
commande. Je veux également que le terminal se ferme une fois qu'il ouvre le fichier pdf.
J'ai essayé d'ajouter exit
à la fin de mon script mais cela ne ferme pas le terminal. J'ai essayé de chercher en ligne une réponse à ma question, mais je n'ai pas trouvé de réponse appropriée, j'apprécierais vraiment si vous pouviez aider.
J'ai besoin d'une réponse qui ne tue que le terminal à partir duquel j'exécute 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'ai pas réalisé que c'était le cas jusqu'à aujourd'hui.
command-line
bash
scripts
Rumesh
la source
la source
gnome-open
parxdg-open
dans mon script mais il n'y a aucun changement. Le terminal reste ouvertRéponses:
Si vous ouvrez un seul fichier, vous n'avez pas vraiment besoin d'utiliser un script, car un script est censé être un moyen facile d'exécuter plusieurs commandes d'affilée, alors qu'ici vous n'avez qu'à exécuter deux commandes (y compris
exit
) .Si vous voulez courir
exit
après une commande ou après une chaîne de commandes, vous pouvez l'enchaîner à ce que vous avez déjà en utilisant l'&&
opérateur (qui, en cas de succès de la commande / chaîne de commandes précédente exécutera la commande suivante) ou en utilisant le;
opérateur (qui, en cas de succès ou d'échec de la commande / chaîne de commandes précédente, exécutera la commande suivante).Dans ce cas, ce serait quelque chose comme ça:
* <path_to_pfd_file> = chemin du fichier pdf
exit
mettre à la fin d'un script ne fonctionne pas car il quitte simplement l'bash
instance dans laquelle le script est exécuté, ce qui est un autrebash
instance que l'bash
instance interne du terminal .Si vous souhaitez utiliser un script de toute façon, la façon la plus simple consiste à simplement appeler le script comme suit:
Ou si le script se trouve dans le répertoire de travail actuel du terminal comme ceci:
Si vous ne voulez vraiment pas / ne pouvez pas faire cela, la deuxième façon la plus simple consiste à ajouter cette ligne à la fin de votre script:
Cela enverra un
SIGKILL
signal au processus parent du script (l'bash
instance liée au terminal). Si une seulebash
instance est liée au terminal, cette suppression entraînera la fermeture du terminal. Si plusieursbash
instances sont liées au terminal, le fait de le tuer ne provoquera pas la fermeture du terminal.la source
SIGTERM
ne suffit pas.Ce script termine le terminal et donc le shell et lui-même.
Il tue sans pitié tous les processus. Si plusieurs onglets sont ouverts dans un terminal, ils sont également fermés.
Le problème est que si plusieurs terminaux sont ouverts et qu'il s'agit de processus enfants
gnome-terminal-server
, tous les terminaux seront tués.Dans ce cas, le script doit être démarré dans un terminal indépendant, par exemple
xterm
PPID
Le PPID est l'ID du processus parent, dans ce cas le shell (
e.g. /bin/bash
)PPPID
Le PPPID est l'ID de 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 des travaux afin 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, car/proc/1/stat
il renvoie 0)la source
ps xa | grep $$
=>4381 pts/0 Ss 0:01 /usr/bin/zsh
Vous pouvez utiliser .
exec ./your-script
Un émulateur de terminal comme GNOME Terminal se ferme lorsque le processus initial qui s'exécute à l'intérieur - qui est généralement un shell - se ferme.
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 programme) particulier, cela signifie que vous n'avez plus vraiment besoin du shell qui y est exécuté. Ainsi, vous pouvez utiliser la fonction
exec
intégrée du shell pour que le shell se remplace par le processus créé par votre commande.exec
.La syntaxe est , par exemple, .
exec command
exec ./your-script
exec
: un exemplePar exemple, supposons que j'ai un script shell appelé
count
, marqué exécutable et situé dans le répertoire courant. Il contient:Et, dans un terminal, je lance:
Imprime les chiffres
5
,4
,3
,2
et1
, un par seconde, puis la fermeture du fenêtre de terminal.Si vous l'exécutez à partir de quelque chose d'autre que le premier processus exécuté dans votre terminal - par exemple, si vous avez exécuté en
bash
premier pour démarrer une autre instance de shell - cela vous ramène au shell qui a créé ce processus, plutôt que de quitter le terminal. (Cette mise en garde s'applique également auxexit
méthodes basées sur.)Vous pouvez utiliser
./your-script; exit
.Si vous ne voulez pas dire à votre shell de se remplacer par le nouveau processus (via
exec
), vous pouvez lui dire de rester, mais de se quitter immédiatement après la fin du nouveau processus.Pour ce faire, exécutez votre commande et la
exit
commande, 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
contre.command && exit
Vous remarquerez peut-être que cela ressemble à la méthode suggérée dans les réponses de kos et heemayl . La différence est que:
./your-script && exit
&&
exécute la deuxième commande uniquement si la première commande a signalé qu'elle a réussi en renvoyant un code de sortie de zéro.;
exécute la deuxième commande, que la première commande ait ou non rapporté un succès.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 y a aussi
command || exit
, qui ne quitte le shell appelant qu'en cas d' écheccommand
signalé .la source
Vous pouvez source votre script au lieu de l'exécuter par exemple
la source
Personnellement, j'exécuterais la commande pour ouvrir un fichier pdf ou d'autres fichiers en sous-shell, mettre un délai pour laisser les fichiers s'ouvrir, puis quitter. En gros, voici ce que j'ai testé
(nohup gnome-open *.pdf &); sleep 2; exit
Une variation à ce sujet serait
nohup gnome-open *.pdf && sleep 2 && exit
la source
nohup
ignore le signal de raccrochage, anohup xdg-open some_program
fonctionné pour moi etexit
n'a pas été nécessaire.nohup
redirige le message vers unnohup.out
fichier:nohup: ignoring input and appending output to nohup.out
La solution la plus simple serait:
Contrairement à d'autres commandes similaires qui
nohup
ne sont pas nécessaires pour ignorer la commandeSIGHUP
, la raison enxdg-open
est la sortie d'un processus enfant qui est l'application préférée pour ouvrir le fichier pdf. Comme le processus réel démarré depuis le terminal n'est plus là pour être tué, ilnohup
n'est pas nécessaire.&&
indique que la prochaine commande sera exécutée si la commande précédente réussit, c'est-à-dire renvoie le code de sortie0
($?=0
) etexit
fermera simplement le terminal.la source
exit
à la fin et n'a pas fonctionné ..exit
à l'intérieur du script, ce qui est inutile car il a pour effet de quitter l'bash
instance dans laquelle le script est exécuté plutôt que l'bash
instance parent (celle liée au Terminal), ce qui entraînerait la fermeture du Terminal à la placexdg-open
s'exécute déjà en arrière-plan et n'est pas lié au terminal, vous n'avez donc pas besoinnohup
ici, et d'après ce que je comprends, OP s'exécutexdg-open
plusieurs fois dans un script pour ouvrir plusieurs fichiers par lots, en utilisantxdg-open
comme cela à l'intérieur du script, le script provoquerait le script sortir à la premièrexdg-open
occurrencexdg-open
dans le backgr, même si je l'ainohup
pour une raison différente et doit être là..tout processus d'arrière-plan du terminal d'origine sera tué lorsque vous tuerez le terminal parent ..nohup
est là pour empêcher il .. comme je n'ai pas besoin d'utiliser à nouveau le terminal de manière interactive, il n'est pas nécessaire de mettre le processus en bg .. sur votre 2ème point qui peut également être empêché en exécutant chacunxdg-open && exit
dans un sous-shell ..Pour répondre explicitement à la question du titre,
"Quitter le terminal après avoir exécuté un script bash" :
Exécutez uniquement votre script dans le terminal
Sans regarder les détails de ce que fait le script, un script peut être exécuté directement à l'intérieur d'un terminal avec l'option
-e
(--command
), sans démarrer un shell - il est utilisé à la place du shell puis:Utilisez l'option
-x
(--execute
) lorsque vous souhaitez fournir des arguments au script. Avec cela, tout le reste de la ligne de commande est considéré comme une commande et des arguments.Si votre script se termine, il n'y a pas de shell interactif qui pourrait contenir quoi que ce soit en attendant l'entrée de l'utilisateur.
Exemples
Le teminal quittera juste après la sortie de la commande en cours d'exécution - comme ceci, la fermeture après
sleep
a fonctionné 4 secondes, sans shell:Bien sûr, vous pouvez toujours utiliser les scripts shell, car votre script utilise de toute façon une instance shell différente.
De plus, vous pouvez exécuter un shell avec un script explicite - il ne sera pas interactif:
la source