Я хочу использовать следующую конструкцию несколько раз в течение моего сценария:Как написать обертку для произвольной команды bash?
tries=0
while ! resposta=$(ssh ${nodes[$k]} 'nproc && uptime'); do
let tries+=1
if ((tries > max_tries)); then
printf "Can't connect to %s !!!" "${nodes[$k]}"
exit 1
fi
printf "Failed! Trying again after %d seconds...\n" "$sleep_time"
sleep $sleep_time
done
Этот код запускает resposta=$(ssh ${nodes[$k]} 'nproc && uptime')
команду несколько раз, пока он не работает, или до тех пор, пока не достигнет максимального числа попыток.
Однако есть много команд, которые я хотел бы обернуть внутри блока, подобного выше. То, что я сейчас делаю, это: повторять весь блок каждый раз, когда я этого хочу, изменяя команду, которая составляет условие цикла while
.
Это, конечно, буйство и глупость. Хотелось бы избежать решений на основе eval
, хотя - по той же причине, что eval
является злым, кроме того, что нарушает синтаксис-подсветку :)
Это не сработает, потому что одинарные кавычки становятся обычными символами. – rici
Вместо использования '$ 1' используйте' '$ @" 'с' repeat ssh '$ {nodes [$ k]} "' nproc && uptime'', но даже тогда' repeat' не сможет принимать произвольные команд оболочки, просто простая команда, состоящая из имени команды и ее аргументов. – chepner
(Это не значит, что это плохая идея, совсем наоборот. Просто написать командную оболочку в оболочке без 'eval'.) – chepner