Оболочки имеют специальные функции для работы с файлами и передачи данных из одной программы в другую (при условии, что данные являются текстовыми). Для этих задач сценарии оболочки могут быть менее громоздкими, чем язык сценариев, такой как 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 требует импорта трех библиотек, в то время как все, что вам нужно для этой задачи, изначально доступно в bash
- Скрипт Python требует явного цикла для перемещения файлов, тогда как это является частью семантики
mv
команды в bash
- Скрипт bash может работать быстрее - вы, вероятно, вызовете его из bash, и вы можете использовать его
source
для запуска в том же экземпляре оболочки
glob.iglob("./*.png")
довольно глоток просто сказать *.png
Если вы хотите написать основную конвейерную операцию на Python, вы будете поражены многословием. (Конечно, некоторые вещи, такие как передача по каналу grep
, могут быть заменены кодом Python, а не использованием внешней программы, поэтому вам часто не нужно передавать так много.)
Как контрпример, мне однажды пришлось написать подпрограмму, которая проверяла, как долго каждое из имен файлов находится в определенном каталоге. Если они были длиннее, чем поддерживаются конкретной ОС, их пришлось сократить. Это может привести к дублированию имен файлов, которые мне нужно было исправить, и, поскольку они будут связаны с веб-страницей, сокращенные имена должны быть стабильными, т. Е. Они должны генерироваться таким образом, чтобы одно и то же длинное имя файла всегда приводило к то же самое сокращенное имя файла. Я сделал это, сгенерировав шестнадцатеричное md5 длинного имени файла и добавив первые четыре символа этого слова к сокращенному имени (имена могли все еще сталкиваться, но это было очень просто, поэтому я просто проверил это условие и кинул залог, если это произойдет) ,
Я сделал это в bash, потому что это было частью нашей системы сборки, которая уже была написана на bash. Это было точно так же сложно, как вы думаете. Написание на Python заняло бы намного меньше времени и, вероятно, было бы более понятным.
Вкратце: разные языки предназначены для разных задач; выберите язык, который вам больше всего подходит для выполнения поставленной задачи.