Bash скрипт не читает ввод

8

У меня есть сценарий, который должен запускать команду в фоновом режиме, и это делает это. Проблема в том, что когда сценарий сталкивается с командой чтения, он не приостанавливает и не принимает ввод. Вот:

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 вы можете read -p "where is yo music? " musicPath
указать

Ответы:

16

Существует множество проблем с этим сценарием, но одна из них вызывает вашу конкретную проблему, потому что вы читаете из канала (вывод ls).

1. Не разбирайтеls

Используйте это вместо

for currentSong in *; do
  ...
done

Помимо многочисленных причин, по которым вы не должны анализировать ls, проблема, которую вы видите, заключается в том, что STDIN подключен к выходу ls. Поэтому, когда вы запускаете read, он не может читать с терминала, потому что STDIN не подключен к терминалу.


2. Используйте больше цитат

У вас довольно много цитат, но некоторые по-прежнему отсутствуют. В основном только на cd.

cd "$musicPath"

также

case "$choice"


3. Не используйте кавычки

Использование backticks иногда хорошо. Я часто использую их в командной строке, так как это быстрее, чем печатать $(). Но для сценариев лучше использовать $()вместо этого.

seconds="$(mdls "$currentSong"|sed -n '20p'|awk '{print $3}'|cut -d. -f1)"


4. мкдир

Вы mkdirсгенерируете (безвредную, но шумную) ошибку, если каталоги уже существуют. Добавьте -pтуда, что заставит mkdirмолча ничего не делать, если оно уже существует

mkdir -p ../Yes


Да, с bash много подводных камней. Не пытаться быть грубым, просто пытаться избавиться от вредных привычек.
Радоваться, веселиться :-)

Патрик
источник
Спасибо за все советы! Я люблю это, так что не беспокойтесь. Всегда люблю изучать новые вещи (:
Cade