Tengo un script que se supone que ejecuta un comando en segundo plano, y lo hace. El problema es que cuando la secuencia de comandos se encuentra con un comando de lectura, no se detiene y no acepta entradas. Aquí está:
printf "Where is yo music?: "
read musicPath
cd $musicPath
ls | while read currentSong;do
seconds=`mdls "$currentSong"|sed -n '20p'|awk '{print $3}'|cut -d. -f1`
hours=$((seconds / 3600))
seconds=$((seconds % 3600))
minutes=$((seconds / 60))
seconds=$((seconds % 60))
echo "Song: $currentSong"
echo "Length: $hours:$minutes:$seconds"
afplay "$currentSong"&
printf "yes (y), no (n), or maybe (m): "
read choice
case $choice in
y)
mkdir ../Yes
mv "$currentSong" ../Yes
;;
n)
mkdir ../No
mv "$currentSong" ../No
;;
m)
mkdir ../Maybe
mv "$currentSong" ../
;;
*)
echo "Invalid option! Continuing..."
;;
esac
kill $!
done
bash
shell
shell-script
input
Cade
fuente
fuente
read -p "where is yo music? " musicPath
Respuestas:
Hay numerosos problemas con ese script, pero el que está causando su problema específico es porque está leyendo desde una tubería (la salida de
ls
).1. No analizar
ls
Use esto en su lugar
Además de las numerosas razones por las que no debe analizar
ls
, el problema que está viendo es porque STDIN está conectado a la salida dels
. Entonces, cuando emite unread
, no puede leer desde el terminal porque STDIN no está conectado al terminal.2. Use más citas
Tienes una buena cantidad de cotizaciones repartidas, pero aún faltan algunas. Principalmente solo en el
cd
.además
3. No uses backticks
Usar backticks está bien a veces. Con frecuencia los uso en la línea de comandos, ya que es más rápido de escribir que
$()
. Pero para las secuencias de comandos, es una buena práctica usar$()
en su lugar.4. mkdir
Su
mkdir
generará un error (inofensivo pero ruidoso) si los directorios ya existen. Agregue un-p
allí que harámkdir
que silenciosamente no haga nada si ya existeSí, hay muchas trampas con bash. No tratando de ser duro, solo tratando de romper los malos hábitos.
Que te diviertas :-)
fuente