Ich versuche, ein bash
Skript zu schreiben , um bestimmte Dateien (hauptsächlich PDF-Dateien) mit dem gnome-open
Befehl zu öffnen . Ich möchte auch, dass das Terminal beendet wird, sobald es die PDF-Datei öffnet.
Ich habe versucht, exit
an das Ende meines Skripts hinzuzufügen , aber das Terminal wird nicht geschlossen. Ich habe versucht, online nach einer Antwort auf meine Frage zu suchen, aber ich konnte keine richtige finden. Ich würde es wirklich begrüßen, wenn ihr helfen könntet.
Ich brauche eine Antwort, die nur das Terminal beendet, von dem aus ich den Befehl ausführe. Sind nicht alle Terminals dazu in der Lage? Die vorherige Antwort, die ich akzeptiert habe, löscht alle geöffneten Terminalfenster. Ich wusste bis heute nicht, dass dies der Fall ist.
quelle
gnome-open
mitxdg-open
in meinem Skript , aber es gibt keine Veränderung. Das Terminal bleibt weiterhin geöffnetAntworten:
Wenn Sie nur eine Datei öffnen, müssen Sie eigentlich kein Skript verwenden, da ein Skript eine einfache Möglichkeit ist, mehrere Befehle hintereinander auszuführen, während Sie hier nur zwei Befehle ausführen müssen (einschließlich
exit
). .Wenn Sie
exit
nach einem Befehl oder nach einer Befehlskette ausführen möchten , können Sie ihn mit dem&&
Operator (der bei Erfolg des vorherigen Befehls / der vorherigen Befehlskette den nächsten Befehl ausführt) oder mit dem Befehl an das, was Sie bereits haben, ketten;
Operator (der sowohl bei Erfolg als auch bei Fehlschlagen des vorherigen Befehls / der vorherigen Befehlskette den nächsten Befehl ausführt).In diesem Fall wäre es ungefähr so:
* <path_to_pfd_file> = Pfad der PDF-Datei
exit
put am Ende eines Skripts funktioniert nicht, da nur diebash
Instanz beendet wird, in der das Skript ausgeführt wird. Dies ist eine anderebash
Instanz als die innerebash
Instanz des Terminals .Wenn Sie trotzdem ein Skript verwenden möchten, ist es am einfachsten, das Skript wie folgt aufzurufen:
Oder wenn sich das Skript wie folgt im aktuellen Arbeitsverzeichnis des Terminals befindet:
Wenn Sie das wirklich nicht wollen / können, ist es am zweithäufigsten einfach, diese Zeile am Ende Ihres Skripts einzufügen:
Dies sendet ein
SIGKILL
Signal an den übergeordneten Prozess des Skripts (diebash
mit dem Terminal verknüpfte Instanz). Wenn nur einebash
Instanz mit dem Terminal verbunden ist, führt der Abbruch dazu, dass sich das Terminal selbst schließt. Wenn mehrerebash
Instanzen mit dem Terminal verbunden sind, führt der Abbruch nicht dazu, dass sich das Terminal selbst schließt.quelle
SIGTERM
hier ist nicht genug.Dieses Skript beendet das Terminal und damit die Shell und sich selbst.
Es bricht gnadenlos alle Prozesse ab. Wenn in einem Terminal mehrere Registerkarten geöffnet sind, werden diese ebenfalls geschlossen.
Das Problem ist, wenn mehrere Terminals geöffnet sind und dies untergeordnete Prozesse von sind
gnome-terminal-server
, werden alle Terminals getötet.In diesem Fall sollte das Skript in einem unabhängigen Terminal gestartet werden, z
xterm
PPID
Die PPID ist die übergeordnete Prozess-ID, in diesem Fall die shell (
e.g. /bin/bash
).PPPID
Die PPPID ist die übergeordnete Prozess-ID der PPID, in diesem Fall das Terminalfenster
<your_command> & disown
In der Bash-Shell wird der Befehl disown builtin verwendet, um Jobs aus der Jobtabelle zu entfernen oder Jobs zu markieren, damit kein SIGHUP-Signal an sie gesendet wird, wenn die übergeordnete Shell dies empfängt (z. B. wenn sich der Benutzer abmeldet).
awk '{print $4}' "/proc/$PPID/stat"
Ruft den Wert der vierten Spalte der Datei ab
/proc/$PPID/stat
(z. B. für den/proc/1/stat
Rückgabewert 0)quelle
ps xa | grep $$
=>4381 pts/0 Ss 0:01 /usr/bin/zsh
Sie können verwenden .
exec ./your-script
Ein Terminal-Emulator wie GNOME Terminal wird beendet, wenn der darin ausgeführte erste Prozess - normalerweise eine Shell - beendet wird.
Wenn Sie sich bereits in einem Terminal befinden und Sie vor dem Beenden dieses Terminals nur noch ein bestimmtes Skript (oder Programm) ausführen möchten, benötigen Sie die Shell, die in diesem Terminal ausgeführt wird, nicht mehr. So können Sie die
exec
eingebaute Shell verwenden, um die Shell zu erstellen durch den von Ihrem Befehl erstellten Prozess zu ersetzen .exec
.Die Syntax lautet
exec command
z .exec ./your-script
exec
: ein BeispielAngenommen, ich habe ein Shell-Skript namens
count
, das als ausführbar markiert ist und sich im aktuellen Verzeichnis befindet. Es beinhaltet:Und in einem Terminal laufe ich:
Dies druckt die Ziffern
5
,4
,3
,2
, und1
, eine pro Sekunde, und dann das Terminal - Fenster schließt.Wenn Sie dies von einem anderen Prozess als dem ersten ausführen, der in Ihrem Terminal ausgeführt wird - wenn Sie beispielsweise
bash
zuerst eine andere Shell-Instanz gestartet haben -, kehren Sie zu der Shell zurück, die diesen Prozess erstellt hat, anstatt das Terminal zu beenden. (Diese Einschränkung gilt auch fürexit
Methoden auf der Grundlage von.)Sie können verwenden .
./your-script; exit
Wenn Sie nicht möchten, dass sich Ihre Shell durch den neuen Prozess (über
exec
) ersetzt, können Sie festlegen, dass sie weiterhin aktiv bleibt, sich jedoch sofort nach Abschluss des neuen Prozesses selbst beendet.Führen Sie dazu Ihren Befehl und den
exit
durch getrennte Befehle aus,;
damit sie in einer Zeile angegeben werden können.Die Syntax lautet
command; exit
z ../your-script; exit
command; exit
gegencommand && exit
Sie werden feststellen, dass dies der in den Antworten von kos und heemayl vorgeschlagenen Methode ähnelt . Der Unterschied ist, dass:
./your-script && exit
&&
Führt den zweiten Befehl nur aus, wenn der erste Befehl durch Zurückgeben eines Beendigungscodes von Null als erfolgreich gemeldet wurde .;
Führt den zweiten Befehl aus, unabhängig davon, ob der erste Befehl erfolgreich war oder nicht.Welches Sie möchten, hängt von der jeweiligen Situation ab. Wenn der Befehl fehlschlägt, soll die aufrufende Shell (und das Hosting-Terminal) aktiv bleiben? Wenn ja, verwenden Sie
&&
; wenn nicht, benutze;
.Es gibt auch
command || exit
, die die aufrufende Shell nur beendet, wenn ein Fehlercommand
gemeldet wird .quelle
Sie könnten Ihr Skript als Quelle verwenden, anstatt es auszuführen, z
quelle
Persönlich würde ich den Befehl ausführen, um PDF- oder andere Dateien in der Subshell zu öffnen, eine Verzögerung zu setzen, um die Dateien öffnen zu lassen und dann zu beenden. Grundsätzlich habe ich Folgendes getestet
(nohup gnome-open *.pdf &); sleep 2; exit
Variation darüber wäre
nohup gnome-open *.pdf && sleep 2 && exit
quelle
nohup
ignoriert das Auflegen-Signal,nohup xdg-open some_program
arbeitete für mich undexit
war nicht erforderlich .nohup
nohup.out
nohup: ignoring input and appending output to nohup.out
Die einfachste Lösung wäre:
Im Gegensatz zu anderen ähnlichen
nohup
BefehlenSIGHUP
, die nicht zum Ignorieren des Befehls benötigt werden ,xdg-open
wird beim Starten eines untergeordneten Prozesses, der die bevorzugte Anwendung zum Öffnen der PDF-Datei ist, das Starten beendet. Da der eigentliche Prozess, der vom Terminal gestartet wird, nicht mehr zum Abbruch da ist,nohup
wird er nicht benötigt.&&
Gibt an, dass der nächste Befehl ausgeführt wird, wenn der vorherige Befehl erfolgreich ist, dh den Beendigungscode0
($?=0
) zurückgibt undexit
das Terminal einfach schließt.quelle
exit
zum Schluss gebracht hat und nicht funktioniert hat ..exit
in das Skript eingefügt wird, ist dies unbrauchbar, da dadurch diebash
Instanz beendet wird, in der das Skript ausgeführt wird, und nicht die übergeordnetebash
Instanz (die mit dem Terminal verknüpfte Instanz), wodurch das Terminal geschlossen wirdxdg-open
läuft es bereits im Hintergrund und ist nicht mit dem Terminal verbunden, sodass Sie es hier nicht benötigen. Soweit ich weißnohup
, wird OPxdg-open
mehrmals in einem Skript ausgeführt, um mehrere Dateien im Batch zu öffnen,xdg-open
wenn das Skript so verwendet wird beim erstenxdg-open
Auftreten zu verlassenxdg-open
in der backgr, auch wenn ich hattenohup
aus einem anderen Grund ist & muss there..any Hintergrundprozess von Ursprungsterminal wird getötet werden , wenn Sie das übergeordnete Terminal töten ..nohup
ist es zu verhindern , es..wenn ich das terminal nicht mehr interaktiv benutzen muss, muss der prozess nicht mehr in bg..auf deinen 2. punkt gesetzt werden, was auch verhindert werden kann, indem jederxdg-open && exit
in einer subshell ausgeführt wird ..Um die Titelfrage explizit zu beantworten,
"Terminal verlassen, nachdem ein Bash-Skript ausgeführt wurde" :
Führen Sie nur Ihr Skript im Terminal aus
Ohne die Details zu betrachten, die das Skript ausführt, kann ein Skript mit der Option
-e
(--command
) direkt in einem Terminal ausgeführt werden , ohne eine Shell zu starten - es wird dann anstelle der Shell verwendet:Verwenden Sie die Option
-x
(--execute
), wenn Sie dem Skript Argumente bereitstellen möchten. Dabei wird nur der gesamte Rest der Befehlszeile als Befehl und Argument verwendet.Wenn Ihr Skript beendet wird, gibt es keine interaktive Shell, die auf Benutzereingaben warten könnte.
Beispiele
Das Teminal wird nur beendet, nachdem der darin ausgeführte Befehl beendet wurde. So wird es geschlossen, nachdem
sleep
es 4 Sekunden ohne Shell ausgeführt wurde:Natürlich können Sie weiterhin Shell-Skripte verwenden, da Ihr Skript ohnehin eine andere Shell-Instanz verwendet.
Sie können eine Shell auch mit einem expliziten Skript ausführen - sie ist nicht interaktiv:
quelle