Aprire una finestra del terminale ed eseguire il comando, quindi chiudere la finestra del terminale se il comando è stato completato correttamente?


0

Sto provando a scrivere una sceneggiatura per fare quanto segue:

  1. Aprire una finestra del terminale che esegue un comando di lunga durata
  2. (Idealmente) sposta la finestra del terminale nell'angolo in alto a sinistra dello schermo usando xdotool
  3. Chiudere la finestra del terminale solo se il comando long running è uscito con un codice di ritorno zero

Per dirla in termini di Windows, mi piacerebbe avere l'equivalente di Linux in start cmd /c long_running_cmdcaso di long_running_cmdsuccesso, e fare l'equivalente di start cmd /k long_running_cmdse non riesce.

Quello che ho finora è uno script che avvia xterm con un determinato comando, quindi sposta la finestra come desiderato:

#!/bin/bash

# open a new terminal window in the background with the long running command
xterm -e ~/bin/launcher.sh ./long_running_cmd &

# move the terminal window (requires window process to be in background)
sleep 1
xdotool search --name launcher.sh windowmove 0 0

E ~ / bin / launcher.sh ha lo scopo di eseguire tutto ciò che gli viene passato come argomento della riga di comando:

#!/bin/bash

# execute command line arguments
$@

Ma non sono stato in grado di chiudere la finestra di xterm dopo aver long_running_cmdfinito.

Penso che qualcosa del genere xterm -e ~/bin/launcher.sh "./long_running_cmd && kill $PPID" &potrebbe essere quello che sto cercando, in modo che xterm venga lanciato in background e funzioni ./long_running_cmd && kill $PPID. Quindi la shell nella finestra xterm esegue quindi il comando long running e se si completa correttamente, il processo parent della shell (cioè il processo che possiede la finestra xterm) viene ucciso, chiudendo così la finestra xterm.

Ma ciò non funziona: non succede nulla, quindi sospetto che il mio preventivo o il mio escape non siano corretti e non sono stato in grado di risolverlo.

Un approccio alternativo sarebbe quello di ottenere il PID di long_running_cmd, usare waitper aspettare che finisca, quindi uccidere la finestra xterm usando kill $!(poiché si $!riferisce all'ultima attività avviata in background, che sarà la finestra xterm). Ma non riesco a trovare un buon modo per ottenere il PID e uscire dal valore della long_running_cmdshell in esecuzione nella finestra xterm e nella shell che ha lanciato la finestra xterm (a meno di scriverli in un file da qualche parte, che sembra che sia dovrebbe essere inutile?).

Cosa sto sbagliando o c'è un modo più semplice per farlo?


L'uscita non funziona? funziona con i miei script.
captain_G

Risposte:


1

SUGGERIMENTO! È possibile verificare il codice di uscita del comando eseguito in precedenza:

if [ $? -eq 0 ]
then
  exit 0
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.