我有一个脚本应该在后台运行命令,它确实做到了。问题是,当脚本遇到读取命令时,它不会暂停并接受输入。这里是:
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
答案1
该脚本有很多问题,但导致您的特定问题的一个是因为您正在从管道( 的输出ls
)读取数据。
1.不解析ls
用这个代替
for currentSong in *; do
...
done
除了您不应该解析的众多原因之外ls
,您看到的问题是因为 STDIN 连接到了 的输出ls
。因此,当您发出 a 时read
,它无法从终端读取,因为 STDIN 未连接到终端。
2.使用更多引号
您已经得到了相当多的报价,但仍然缺少一些。主要只是在cd
.
cd "$musicPath"
还
case "$choice"
3.不要使用反引号
有时使用反引号是可以的。我经常在命令行上使用它们,因为它比$()
.但对于脚本编写来说,最好使用$()
它。
seconds="$(mdls "$currentSong"|sed -n '20p'|awk '{print $3}'|cut -d. -f1)"
4. 目录
mkdir
如果目录已经存在,您将生成一个(无害但有噪音的)错误。-p
在那里添加一个mkdir
,如果它已经存在,这将导致静默不执行任何操作
mkdir -p ../Yes
是的,bash 有很多陷阱。并不是要严厉,只是想改掉坏习惯。
玩得开心 :-)