Предполагая, что вы хотите выполнить десять раз, этот синтаксис будет работать:
parallel -n0 foo.sh ::: {1..10}
parallel
нужна входная последовательность некоторой длины ( ::: {1..10}
) И вам нужно игнорировать содержимое входной последовательности ( -n0
), вам важна только ее длина.
Ваша исходная команда: parallel foo.sh
не содержит входной последовательности, указывающей, какой параллелизм вы хотите. Загадочное предупреждение говорит вам, что parallel
начнет слушать терминал на предмет последовательности ввода, и что это, вероятно, не то, что вы хотите.
Вот учебный пример:
seq 10 | parallel -n0 my_command my_args
Как это устроено:
parallel
всегда берет входную последовательность откуда-то. Это может быть встроенная последовательность, разделенная пробелами, перед которой :::
ИЛИ последовательность, разделенная символом новой строки, из файла или файловоподобного источника, такого как канал. В этом примере входная последовательность из трубы.
seq 10
создает разделенную символом новой строки последовательность цифр от одной до десяти.
-n0
Опция указывает параллельно игнорировать значения в последовательности ввода. Нам важна только длина последовательности, а не ее содержимое. Даже если цифры не используются, команда все равно будет выполнена десять раз.
Другой пример:
parallel -n0 echo -n 'x' ::: {1..5}
Как это устроено:
- Входная последовательность встроена.
{1..5}
производит разделенную пробелами последовательность цифр от одной до пяти.
-n0
игнорирует значения последовательности (и 'x'
вместо этого мы выводим строку каждый раз)
- Вывод:
xxxxx
По сравнению с:
parallel echo -n ::: {1..5}
Как это устроено:
- Входная последовательность встроена.
{1..5}
производит разделенную пробелами последовательность цифр от одной до пяти.
- Каждое значение из входной последовательности используется в качестве аргумента для
echo
. Заказ не гарантирован.
- Выход:
43215
. Может быть любой заказ.