2012-07-27 25 views
6

Ho una situazione in cui in Ho un comando nel mio script di shell che deve essere eseguito dopo un comando exit viene eseguito nello stesso script (lo so !! sembra pazzesco !!)Shell script: Esegui comando dopo l'esecuzione di "uscita" comando nella shell script

voglio trovare una soluzione per qualcosa come

#!/bin/sh 
ls -l ~/. 
exit $? 
touch ~/abc.txt 

Qui voglio il comando touch ~/abc.txt eseguire dopo exit $? ha eseguito e il comando può essere touch ~/abc.txt qualsiasi comando

Vincoli: 1) Non riesco a modificare la parte exit $? dello script precedente. 2) Il comando deve essere eseguito solo dopo il comando exit $?.

Non sono sicuro se esiste una soluzione per questo, ma qualsiasi aiuto è apprezzato.

+0

Possiamo sapere perché non è possibile modificare quelle prime righe? – arkascha

+0

Siamo spiacenti !! Ho modificato la parte dei vincoli della mia domanda ora. Posso cambiare qualcosa nella sceneggiatura ma il comando di uscita deve rimanere !! – latestVersion

+0

Se non puoi modificare lo script, come ti aspetti di aggiungere il comando 'touch'? Se si _can_ modificare lo script, perché non è possibile aggiungerlo sopra l'exit? – Shahbaz

risposta

10

L'approccio tipico è una trappola:

trap 'touch ~/abc.txt' 0 

Questo invocherà il comando touch quando la shell. In alcuni shell (ad esempio bash), il trap verrà eseguito anche se lo script termina come risultato di un segnale, ma in altri (ad esempio dash) non lo farà. Non esiste un modo portatile per richiamare il comando solo se l'ultimo comando era exit.

+0

Grazie !! Questo aiuta. – latestVersion

0

Dubito che la via diretta sia possibile in qualsiasi modo.

Ma potrebbe esserci una soluzione alternativa: è possibile includere lo script di esecuzione in un altro processo? Quindi puoi chiamare tutto ciò che vuoi nello script di wrapping, una volta che lo script spostato ha eseguito il suo exit() e rimosso dallo stack.

1

Non so perché vuoi fare qualcosa del genere ma magari provare qualcosa del genere: avvolgi il tuo script in un altro. Nello script genitore, valuta lo script figlio con un comando come eval o source, quindi estrai l'ultimo comando script figlio ed eseguilo separatamente nello stesso modo.

+0

+1: il trucco di estrazione rende questa risposta migliore della mia. – arkascha

+0

Per quanto desidero, non posso usare un wrapper sul mio script poiché sto modificando lo script "tcruntime-ctl.sh" di vFabric tcServer. – latestVersion

+0

Sono costretto a modificare solo questo script ora! :( – latestVersion

0

Questo dovrebbe funzionare, anche se OP non ha voluto spostare l'uscita.

#!/bin/sh 
ls -l ~/. 
RES=$?  #save res for later. 
touch ~/abc.txt 
exit $RES 
Problemi correlati