Мне нужно перезагрузить несколько машин удаленно. Обычно я просто выдаю
for host in <hostlist>;do ssh ${host} 'sudo shutdown -r now';done
Но я хочу дать пользователям время до перезагрузки. Однако они не будут отключать ssh, даже если я использую:
ssh -f 'sudo shutdown -r +5 &;disown'
Я получаю сообщение об ошибке:
bash: -c: строка 0: синтаксическая ошибка рядом с неожиданным
;' bash: -c: line 0:
отключением sudo токена -r +5 &; disown '
Какие-либо предложения?
&
Персонаж делает послать команду на левой стороне в фоновом режиме. Вот как это отличается от;
.Ответы:
Как указано в сообщении об ошибке, в вашей команде есть синтаксическая ошибка. Это происходит из-за немного удивительного факта, что
&
это не часть команды оболочки, а скорее разделитель между командами (как;
есть). Хотя оба являются разделителями команд, они&
оказывают дополнительное влияние на команду с левой стороны. Это, конечно, иногда смущает меня, и я часто совершаю одну и ту же ошибку. Как только вы это знаете, это легко исправить.Исправление состоит в том, чтобы не писать,
&;
а просто писать один из двух разделителей в зависимости от вашего намерения. (И в большинстве случаев, когда кто-то написал,&;
намеревался только написать&
).Это должно работать:
источник
sudo shutdown -r +5 &
в фоновом режиме, а затем бежатьdisown
? Как бы Bash справиться с такой ситуацией? Я ожидаю, что это будет идеальный синтаксис для команды, даже имея&;
. Если;
это разделитель команд, то у вас есть 2 команды на руках. Правильно?&
запускает первую команду в фоновом режиме, а после запуска первой команды вторая команда будет выполняться на переднем плане.sudo shutdown -r +5 &; disown
это не похоже на плохой синтаксис. Я имею в виду, что я хотел бы запустить первую часть в фоновом режиме, а затем 2-ю часть.sudo shutdown -r +5 &; disown
будут рассматриваться как три действительные команды, разделенные&
и;
. Это, однако, означает, что нужно быть осторожным, чтобы не использовать дополнительный разделитель, если будет использоваться статус существования предыдущей команды. Это означает , что один должен обратить внимание на tokenizing, а так как , например ,&&
и& &
получает лексемы по- разному.