Я всегда считал, что для повседневных задач в небольших скриптах куда проще использовать Bash — он нативный для запускаемой системы, а функционала, который предоставляют системные утилиты — вполне достаточно.
Однако для более сложных задач, таких как анализ данных, я предпочитаю использовать Python. Недавно я разрабатывал новый скрипт, который анализирует большое количество файлов, причем некоторые из них зашифрованы с помощью Ansible Vault. Ранее я уже расшифровывал такие файлы в Bash-скриптах, используя следующую команду:
find . -name "*-secrets.yaml" -exec ansible-vault decrypt {} --vault-password-file pass.txt \;
Расшифровка всех файлов занимала около 40 секунд, но на удаленном агенте с другой конфигурацией железа процесс затягивался до 3-4 минут. В конечном итоге, я решил запускать расшифровку файлов параллельно, что позволило сэкономить несколько минут:
find . -type f -name "*-secrets.yaml" -print0 | xargs -0 -P 20 -I % sh -c 'ansible-vault encrypt % --vault-password-file pass.txt'
Когда я реализовывал аналогичный функционал на Python, у меня был объект [список файлов для расшифровки]. Исходя из опыта с Bash, я подумал, что мне также необходимо выполнять расшифровку параллельно, однако решив проверить, сколько времени это займет внутри цикла с использованием библиотеки Ansible я был удивлен: результат оказался примерно одинаковым как локально, так и на агенте — около 12 секунд.
Тут речь не про саму расшифровку, а обработку циклов.
Если сделать простой тест:
# test.py
for i in range(10000001):
print(i)
# test.sh
#!/bin/bash
for i in {0..10000000}
do
echo $i
done
И запустить каждый, разница может быть больше, чем в 5 раз:
python3 test.py > test_result_python 3.26s user 0.06s system 98% cpu 3.353 total
bash test.sh > test_result_bash 16.75s user 15.53s system 98% cpu 32.883 total
Разумеется, все зависит от объема данных и какие задачи вы выполняете, но когда полезно сэкономить время, опираться на Bash — рискованная затея.