Оболонки мають спеціалізовані функції для роботи з файлами та передачі даних з однієї програми в іншу (припустимо, що дані є текстовими). Для цих завдань сценарії оболонки можуть бути менш громіздкими, ніж мова сценаріїв, як Python.
Скептування оболонок також має перевагу в тому, що команди, які ви використовуєте, в основному є тими ж командами, які ви використовували б у командному рядку - тому, якщо ви можете виконати щось в оболонці, ви зможете прописати одну й ту саму операцію.
Ось, наприклад, сценарій bash, який переміщує всі файли PNG з поточного каталогу у вказаний каталог.
#!/usr/bin/sh
mv *.png $1
Ось версія Python.
#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
shutil.move(filename, sys.argv[1])
Ви помітите:
- Сценарій bash на третину довший, ніж Python, якщо рахувати рядки (виключаючи лінію shebang) - ще менше за кількістю символів
- Сценарію Python потрібно імпортувати три бібліотеки, в той час як все, що потрібно для цього завдання, доступне в базі
- Сценарій Python вимагає явного циклу для переміщення файлів, тоді як це є частиною семантики
mv
команди в bash
- Сценарій bash може працювати швидше - ви, ймовірно, будете викликати його з bash, і ви можете використовувати його
source
для запуску в тому самому екземплярі оболонки
glob.iglob("./*.png")
є досить ротним просто сказати *.png
Якби ви хотіли написати основну операцію з трубою в Python, ви були б вражені багатослівністю. (Зрозуміло, деякі речі, як-от пропуск через трубопровід grep
, можна замінити кодом Python, а не використовувати зовнішню програму, тому часто вам не потрібно так багато.)
Як контрприклад, одного разу мені довелося написати процедуру, яка перевіряла, як довго кожна з імен файлів знаходилась у певному каталозі. Якщо вони були довше, ніж підтримували певну ОС, їх треба було скоротити. Це може призвести до повторних імен файлів, які мені потрібно було виправити, і оскільки вони будуть пов’язані з веб-сторінки, скорочені імена повинні бути стабільними, тобто вони повинні створюватися таким чином, щоб завжди випливало те саме довге ім'я файлу таке ж скорочене ім’я файлу. Я зробив це, генеруючи шістнадцятковий md5 довгого імені файлу і додавши перші чотири символи цього до скороченого імені (імена все-таки могли зіткнутися, але це було дуже однозначно, тому я просто перевірив, чи є такий стан, і, якщо це сталося) .
Я зробив це в bash, тому що це було частиною нашої системи збирання, про яку вже було написано bash. Бути точно так само важко, як ви, напевно, думаєте. На написання Python пішло б набагато менше часу, і, мабуть, було б і зрозуміліше.
Якщо коротко: різні мови розроблені для різних завдань; виберіть доступну для вас мову, яка найкраще відповідає задачі.