У меня есть сценарий, который должен запускать команду в фоновом режиме, и это делает это. Проблема в том, что когда сценарий сталкивается с командой чтения, он не приостанавливает и не принимает ввод. Вот:
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
можжевельник
источник
источник
read -p "where is yo music? " musicPath
Ответы:
Существует множество проблем с этим сценарием, но одна из них вызывает вашу конкретную проблему, потому что вы читаете из канала (вывод
ls
).1. Не разбирайте
ls
Используйте это вместо
Помимо многочисленных причин, по которым вы не должны анализировать
ls
, проблема, которую вы видите, заключается в том, что STDIN подключен к выходуls
. Поэтому, когда вы запускаетеread
, он не может читать с терминала, потому что STDIN не подключен к терминалу.2. Используйте больше цитат
У вас довольно много цитат, но некоторые по-прежнему отсутствуют. В основном только на
cd
.также
3. Не используйте кавычки
Использование backticks иногда хорошо. Я часто использую их в командной строке, так как это быстрее, чем печатать
$()
. Но для сценариев лучше использовать$()
вместо этого.4. мкдир
Вы
mkdir
сгенерируете (безвредную, но шумную) ошибку, если каталоги уже существуют. Добавьте-p
туда, что заставитmkdir
молча ничего не делать, если оно уже существуетДа, с bash много подводных камней. Не пытаться быть грубым, просто пытаться избавиться от вредных привычек.
Радоваться, веселиться :-)
источник