Как можно запустить несколько команд и справиться с ними с помощью bash?
Например:
$ for i in {1..10}; do wait file$i &; done
где wait - это пользовательский бинарный файл.
Прямо сейчас я получаю ошибку:
syntax error near unexpected token `;'
при запуске вышеуказанной команды.
После того, как задний план задан, команды должны работать параллельно.
nohup
позволяя вам выполнить команду в фоновом режиме&
и;
оба «команда терминаторов». Вам не нужно использовать оба:for ...; do wait $arg & done
будет работать.Ответы:
&
, Так же , как;
это список терминатор оператора. Они имеют одинаковый синтаксис и могут использоваться взаимозаменяемо (в зависимости от того, что вы хотите сделать). Это означает, что вам не нужно или не нужноcommand1 &; command2
все, что вам нужноcommand1 & command2
.Итак, в вашем примере вы могли бы просто написать:
и каждая
wait
команда будет запущена в фоновом режиме, и цикл немедленно перейдет к следующей.источник
Для совместимости используйте форму posix вместо расширения:
источник
seq
это не команда POSIX, и обычно она встречается только в системах GNU. Поведение или$(...)
(и$i
) зависит от текущего значения$IFS
. Кроме того, обратите внимание , что при этом(cmd &)
,cmd
будет ребенком субоболочки, так что вы не сможете ждать и получить свой статус завершения, например.Вы можете сгруппировать команды и поместить сгруппированные команды в фоновом режиме. Подобно :
источник
Ваш бинарный файл действительно назван
wait
? Я не рекомендую делать это, потому чтоwait
это встроенная оболочка.Я считаю, что bash плохо разбирает однострочный цикл, запускающий фоновые процессы. Я предлагаю вам изменить код на:
источник