El problema era set -e
. Si uno presiona p. Ctrl -c mientras varios comandos se canalizan juntos, SIGINT no se envía al script, sino a otro lugar. Esto crea un error que es manejado por set -e
, por lo que el script sale directamente. Para usar set -e
confiable en scripts con tuberías, también se debe atraparEXIT
:
#!/bin/sh
set -e
temp_dir=`mktemp -d`
cd $temp_dir
trap "rm -r $temp_dir; exit" HUP INT TERM PIPE EXIT
for db in db1 db2 db3
do
pg_dump $db postgres > $db.sql
done
tar cJf -.
En este caso, también lo normal exit
es manejado por trap, que en muchos casos es de todos modos útil.
Не проверено!
#!/bin/bash
ETX=$'\003'
STX=$'\002'
# Open /dev/ttyUSB0 open on FD9
exec 9< /dev/ttyUSB0
# do any stty stuff needed on fd9
# e.g.
# stty 9600 < /proc/self/fd/9 > /proc/self/fd/9
# now loop, reading from the device,
while IFS= read -rd "$ERX" -u 9 wibble
do
wibble=${wibble#"$STX"}
printf 'Got %q\n' "$wibble"
# Do something
done
С bash
это не будет работать, если данные содержат байты NUL. Вместо этого вам нужно было бы использовать zsh
.