Я не уверен, что здесь можно делать то, что вы хотите (то есть, если read
принимает данные от пользователя, а не от ls
). Проблема в том, что все стандартные входные данные для вашего скрипта взяты из канала, точка. Это тот же файловый дескриптор, поэтому он не будет «переключаться» на терминал только потому, что вы этого хотите.
Один из вариантов - запустить ls
как дочерний элемент сценария, например:
#!/bin/bash
ls | while read line
do
echo $line
done
read -p "y/n" x
echo "got $x"