Запуск всех сценариев оболочки в папке
У меня есть много скриптов .sh
в одной папке и я хотел бы запускать их один за другим. Один скрипт может выполняться как:
bash wget-some_long_number.sh -H
Предположим, что в моем каталоге есть /dat/dat1/files
Как я могу запустить bash wget-some_long_number.sh -H
один за другим?
Я понимаю, что в этой строке должно работать:
for я in *.sh;...do....; done
Ответы
Ответ 1
Использовать этот:
for f in *.sh; do # or wget-*.sh instead of *.sh
bash "$f" -H
done
Если вы хотите остановить все выполнение при сбое скрипта:
for f in *.sh; do
bash "$f" -H || break # execute successfully or break
# Or more explicitly: if this execution fails, then stop the 'for':
# if ! bash "$f" -H; then break; fi
done
Если вы хотите запустить, например, x1.sh
, x2.sh
,..., x10.sh
:
for i in 'seq 1 10'; do
bash "x$i.sh" -H
done
Ответ 2
существует гораздо более простой способ, вы можете использовать команду run-parts
которая будет выполнять все скрипты в папке:
run-parts /path/to/folder
Ответ 3
Я столкнулся с этой проблемой, когда я не мог использовать циклы и работы с cron.
Ответ:
foo () {
bash -H $1
#echo $1
#cat $1
}
cd /dat/dat1/files #change directory
export -f foo #export foo
parallel foo ::: *.sh #equivalent to putting a & in between each script
Вы используете GNU parallel, это выполняет все в каталоге, с добавленным баффом это происходит намного быстрее. Не говоря уже о том, что это происходит не только с выполнением скрипта, вы можете поместить любую команду в функцию, и она будет работать.