O script Bash não lê a entrada

8

Eu tenho um script que é suposto para executar um comando em segundo plano, e isso. O problema é que quando o script chega a um comando de leitura, ele não pausa e aceita entrada. Aqui 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
    
por Cade 12.08.2012 / 05:33

1 resposta

16

Existem vários problemas com esse script, mas o que está causando o problema específico é porque você está lendo de um canal (a saída de ls ).

1. Não analise ls

Use isso em vez

for currentSong in *; do
  ...
done

Além das inúmeras razões pelas quais você não deve analisar ls , o problema que você está vendo é porque STDIN está conectado à saída de ls . Então, quando você emite um read , ele não pode ler do terminal porque o STDIN não está conectado ao terminal.


2. Use mais citações

Você tem uma boa quantidade de citações espalhadas, mas ainda falta algumas. Principalmente apenas no cd .

cd "$musicPath"

também

case "$choice"


3. Não use backticks

O uso de backticks está ok às vezes. Eu os uso frequentemente na linha de comando, pois é mais rápido digitar do que $() . Mas, para scripts, é uma boa prática usar $() .

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


4. mkdir

Seu mkdir gerará um erro (inofensivo, mas barulhento) se os diretórios já existirem. Adicione um -p lá, o que fará com que o mkdir silenciosamente não faça nada se já existir

mkdir -p ../Yes

Sim, há muitas armadilhas com o bash. Não tentando ser duro, apenas tentando quebrar maus hábitos.
Divirta-se: -)
    
por 12.08.2012 / 06:25