Не знайте, помогло ли это, но более чистый способ записать, что это было бы
for nu in `ruby -e '(0..20).each { |i| puts i}'`; do
tssh "MYBOXES$nu"
done
Я также не уверен в том, почему это перестало работать, но мне нравится xargs
и seq
:
seq 0 20 | xargs -n1 tssh MYBOXES
я наклоняюсь, полагают, что это был результат 0, который повредил Ваш цикл, можно протестировать против этого путем замены команды tssh в цикле с "/bin/true", который также возвращается 0.
относительно стиля я не понимаю, почему для простого сценария оболочки цикличного выполнения нужны рубин, жемчуг, seq или капля или любой другой двоичный файл, который не находится на моем *BSD.
можно альтернативно использовать оболочки, встроенные для конструкции цикла, которая работает, по крайней мере, в ksh, ударе:
for ((i=0; $i<=20; i++)); do
tssh "MYBOXES$i"
done
Я столкнулся с этим сегодня - rsh и / или ssh могут прервать цикл чтения из-за его использования с помощью stdin. Я поместил -n в строку ssh, которая останавливает его от попытки использовать stdin, и это решило проблему.
Как упоминал Кайи, называть ruby или seq действительно излишне (что не работает на компьютерах с BSD или OSX) просто для вывода диапазона чисел. Если вы довольны использованием bash, вы можете:
for i in {0..20}; do
# command
done
Я считаю, что это должно работать для bash 2.05b и выше.
Крис прав. Источником разрыва цикла был SSH с использованием stdin, однако guns правильно - это использование методологии цикла.
Если вы выполняете цикл через ввод (например, файл со списком имен хостов), и вызывая SSH, вам необходимо передать параметр -n, иначе ваш цикл, основанный на вводе, завершится ошибкой.
while read host; do
ssh -n $host "remote command" >> output.txt
done << host_list_file.txt