Ich habe ein Skript, das einen Befehl im Hintergrund ausführen soll, und das tut es. Das Problem ist, dass das Skript beim Lesen nicht pausiert und keine Eingaben akzeptiert. Hier ist es:
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
quelle
quelle
read -p "where is yo music? " musicPath
Antworten:
Es gibt zahlreiche Probleme mit diesem Skript, aber das Problem, das Ihr spezifisches Problem verursacht, ist, dass Sie aus einer Pipe lesen (die Ausgabe von
ls
).1. Nicht analysieren
ls
Verwenden Sie dies stattdessen
Abgesehen von den zahlreichen Gründen, die Sie nicht analysieren sollten
ls
, liegt das Problem darin, dass STDIN mit dem Ausgang von verbunden istls
. Wenn Sie also a ausgebenread
, kann es nicht vom Terminal lesen, da STDIN nicht mit dem Terminal verbunden ist.2. Verwenden Sie mehr Anführungszeichen
Sie haben eine ganze Reihe von Zitaten verteilt, aber es fehlen noch einige. Hauptsächlich nur auf der
cd
.ebenfalls
3. Verwenden Sie keine Backticks
Die Verwendung von Backticks ist manchmal in Ordnung. Ich benutze sie häufig in der Kommandozeile, da sie schneller zu tippen sind als
$()
. Für Skripte empfiehlt es sich jedoch,$()
stattdessen zu verwenden .4. mkdir
Sie
mkdir
werden einen (harmlosen, aber lauten) Fehler erzeugen, wenn die Verzeichnisse bereits vorhanden sind. Fügen Sie-p
dort ein hinzu, das dazu führt, dass dermkdir
Benutzer nichts tut, wenn er bereits vorhanden istJa, es gibt viele Fallstricke bei Bash. Nicht versuchen, hart zu sein, sondern nur schlechte Gewohnheiten zu brechen.
Habe Spaß :-)
quelle