Пишем мы скрипт на баше, и нужно нам считать файл построчно, это делается вот так
И... и этот код будет работать не так как нам хотелось бы. Отработает только одна итерация цикла, не зависимо от того сколько строк в файле.
Проблема заключается в том что cat делает вывод в stdin из которого конвейером данные переходят в read. Но и ssh тоже использует stdin для своих целей и сливает все данные в себя (либо просто "забывает" их). И по когда управление будет снова передано на проверку условия, в stdin уже будет пусто и мы выйдем из цикла. Неожиданно ? да :)
Так как же нам решить эту проблему ? А вот так
cat number.txt | while read line do echo $line doneНо вот нам потребовалось сделать в теле цикла что то по ssh. Мы смело вставляем нужный код
cat number.txt | while read line do echo $line ssh user@127.0.0.1 "ls" done(представим что у нас настроена авторизация по открытому ключу).
И... и этот код будет работать не так как нам хотелось бы. Отработает только одна итерация цикла, не зависимо от того сколько строк в файле.
Проблема заключается в том что cat делает вывод в stdin из которого конвейером данные переходят в read. Но и ssh тоже использует stdin для своих целей и сливает все данные в себя (либо просто "забывает" их). И по когда управление будет снова передано на проверку условия, в stdin уже будет пусто и мы выйдем из цикла. Неожиданно ? да :)
Так как же нам решить эту проблему ? А вот так
exec 10<$PAIR_CONFIG while read line <&10 do echo $line ssh user@127.0.0.1 "ls" doneМы связываем файловый дескриптор №10 с нужным нам файлом. И далее производим чтение уже из этого потока.