цикл bash прерывается при вызове команды ssh в цикле - PullRequest
0 голосов
/ 12 мая 2019

Приведенный ниже скрипт сломается при первой команде ssh. Не выдает ошибку, но прерывает цикл while. Отладка сценария с помощью set -vx покажет, что read -r line не читает ничего из итерируемой переменной.

Как только я закомментирую строку ssh, она будет работать успешно и перебирать весь цикл.

Можете ли вы помочь разгадать тайну здесь?

Спасибо!

Сценарий:

#!/bin/bash
set -vx
file_list=$(cat <<EOT
aaa
bbbb
ccccc
dddddd
eeeeeee
EOT
)

while read -r line; do
    echo ${line}
    ssh 192.168.100.222 touch /tmp/${line}
done <<< "${file_list}"

Вывод с закомментированной строкой ssh ​​(set -vx здесь опущен)

aaa
bbbb
ccccc
dddddd
eeeeeee

Вывод с включенной строкой ssh ​​

aaa

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Используйте массив вместо строки, так что вы просто просматриваете содержимое массива, а не полагаетесь на то, что можете читать из stdin:

file_list=(
aaa
bbbb
ccccc
dddddd
eeeeeee
)

for file in "${file_list[@]}"; do
    echo "$file"
    ssh 192.168.100.222 touch "/tmp/$file"
done

Чтобы сделать Google более надежным, как лучше всего заполнить массив из списка строк, разделенных новой строкой (ищите readarray, maparray и IFS=$'\n' - я не помню "лучшего" заклинания из верх моей головы).

1 голос
/ 12 мая 2019

Добавить параметр -n в ssh, чтобы остановить чтение из стандартного ввода.


См .: man ssh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...