Bash, в то время как считанный цикл, повреждающийся рано, [копируют]

28
задан codeforester 23 February 2017 в 00:22
поделиться

6 ответов

Не знайте, помогло ли это, но более чистый способ записать, что это было бы

for nu in `ruby -e '(0..20).each { |i| puts i}'`; do
  tssh "MYBOXES$nu" 
done
4
ответ дан Paul Tomblin 28 November 2019 в 02:19
поделиться

Я также не уверен в том, почему это перестало работать, но мне нравится xargs и seq:

seq 0 20 | xargs -n1 tssh MYBOXES
3
ответ дан Johannes Schaub - litb 28 November 2019 в 02:19
поделиться

я наклоняюсь, полагают, что это был результат 0, который повредил Ваш цикл, можно протестировать против этого путем замены команды tssh в цикле с "/bin/true", который также возвращается 0.

относительно стиля я не понимаю, почему для простого сценария оболочки цикличного выполнения нужны рубин, жемчуг, seq или капля или любой другой двоичный файл, который не находится на моем *BSD.

можно альтернативно использовать оболочки, встроенные для конструкции цикла, которая работает, по крайней мере, в ksh, ударе:

for ((i=0; $i<=20; i++)); do
    tssh "MYBOXES$i"
done
2
ответ дан Kaii 28 November 2019 в 02:19
поделиться

Я столкнулся с этим сегодня - rsh и / или ssh могут прервать цикл чтения из-за его использования с помощью stdin. Я поместил -n в строку ssh, которая останавливает его от попытки использовать stdin, и это решило проблему.

7
ответ дан 28 November 2019 в 02:19
поделиться

Как упоминал Кайи, называть ruby ​​или seq действительно излишне (что не работает на компьютерах с BSD или OSX) просто для вывода диапазона чисел. Если вы довольны использованием bash, вы можете:

for i in {0..20}; do
    # command
done

Я считаю, что это должно работать для bash 2.05b и выше.

3
ответ дан Foo Bah 28 November 2019 в 02:19
поделиться

Крис прав. Источником разрыва цикла был SSH с использованием stdin, однако guns правильно - это использование методологии цикла.

Если вы выполняете цикл через ввод (например, файл со списком имен хостов), и вызывая SSH, вам необходимо передать параметр -n, иначе ваш цикл, основанный на вводе, завершится ошибкой.

while read host; do
  ssh -n $host "remote command" >> output.txt
done << host_list_file.txt
41
ответ дан 28 November 2019 в 02:19
поделиться