Tengo un script de shell que lee de la entrada estándar . En circunstancias excepcionales, no habrá nadie listo para proporcionar información, y el script debe agotar el tiempo de espera . En caso de tiempo de espera, el script debe ejecutar algún código de limpieza. ¿Cuál es la mejor manera de hacer eso?
Este script debe ser muy portátil , incluidos los sistemas Unix del siglo XX sin un compilador de C y los dispositivos integrados que ejecutan busybox, por lo que no se puede confiar en Perl, bash, cualquier lenguaje compilado e incluso POSIX.2 completo. En particular, $PPID
, read -t
trampas y perfectamente compatibles con POSIX no están disponibles. Escribir en un archivo temporal también está excluido; el script podría ejecutarse incluso si todos los sistemas de archivos están montados de solo lectura.
Solo para hacer las cosas más difíciles, también quiero que el script sea razonablemente rápido cuando no se agote el tiempo. En particular, también uso el script en Windows (principalmente en Cygwin), donde fork y exec son particularmente bajos, por lo que quiero mantener su uso al mínimo.
En pocas palabras, tengo
trap cleanup 1 2 3 15
foo=`cat`
y quiero agregar un tiempo de espera No puedo reemplazar cat
con el read
incorporado. En caso de tiempo de espera, quiero ejecutar la cleanup
función.
Antecedentes: este script adivina la codificación del terminal imprimiendo algunos caracteres de 8 bits y comparando la posición del cursor antes y después. El comienzo de la secuencia de comandos prueba que stdout está conectado a un terminal compatible, pero a veces el entorno está mintiendo (por ejemplo, se plink
establece TERM=xterm
incluso si se llama conTERM=dumb
). La parte relevante del script se ve así:
text='Éé' # UTF-8; shows up as Ãé on a latin1 terminal
csi='␛['; dsr_cpr="${csi}6n"; dsr_ok="${csi}5n" # ␛ is an escape character
stty_save=`stty -g`
cleanup () { stty "$stty_save"; }
trap 'cleanup; exit 120' 0 1 2 3 15 # cleanup code
stty eol 0 eof n -echo # Input will end with `0n`
# echo-n is a function that outputs its argument without a newline
echo-n "$dsr_cpr$dsr_ok" # Ask the terminal to report the cursor position
initial_report=`tr -dc \;0123456789` # Expect ␛[42;10R␛[0n for y=42,x=10
echo-n "$text$dsr_cpr$dsr_ok"
final_report=`tr -dc \;0123456789`
cleanup
# Compute and return initial_x - final_x
¿Cómo puedo modificar el script para que si tr
no ha leído ninguna entrada después de 2 segundos, se elimina y el script ejecuta la cleanup
función?