Скрипт exec bash для каждого элемента в списке

У меня есть текстовый файл с URL

http://example.com/1
http://example.com/2

и т.п.

У меня есть сценарий bash, который принимает URL-адрес как $1 и работает с ним. Я хотел бы автоматизировать это, и я попытался с

cat urls.txt | xargs -P0 bash -c myscript.sh

но $1 приходит как пустой

3 ответа

Решение

Я предлагаю вам использовать read с циклом while, вот пример:

#!/bin/bash

while read -r line      # read a line from file.
do
  echo "$line"
  ./myscript.sh "$line"             # pass a line to the script
done < urls.txt                  

Вам не нужно -c (или же cat):

xargs -P0 bash myscript.sh < urls.txt

-c принимает строковый аргумент для использования в качестве команды, например,

$ bash -c 'echo foo'
foo

Когда используешь -cследующий аргумент после командной строки используется в качестве значения для $0не $1:

$ bash -c 'echo Command: $0; echo Arg: $1' zeroth first
Command: zeroth
Arg: first

С GNU Parallel это выглядит так:

cat urls.txt | parallel -j0 ./myscript.sh

GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh. Это часто может заменить for петля.

Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Простое планирование

GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая активные процессоры и, таким образом, экономя время:

Параллельное планирование GNU

Монтаж

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку, которая не требует root-доступа. Это можно сделать за 10 секунд, выполнив это:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Для других вариантов установки см. http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Учить больше

Смотрите больше примеров: http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Просмотрите учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html

Подпишитесь на список рассылки, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel

Другие вопросы по тегам