Сильные стороны сценариев оболочки по сравнению с Python [закрыто]


95

Я несколько раз пытался изучить сценарии оболочки (bash), но меня оттолкнул синтаксис. Затем я нашел Python и смог сделать большинство вещей, которые скрипт оболочки может делать в Python. Сейчас я не уверен, стоит ли мне больше тратить свое время на изучение сценариев оболочки. Итак, я хочу спросить:

Каковы сильные стороны сценариев оболочки, которые делают его незаменимым инструментом по сравнению с Python?

Я не являюсь системным администратором по профессии, но меня интересует настройка систем Linux для домашних пользователей, поэтому я думаю, что изучение сценариев оболочки может стать необходимым.

Ответы:


83
  • В сценариях оболочки есть более простые обозначения для перенаправления ввода-вывода.
  • Проще создавать конвейеры из существующих программ в оболочке.
  • Сценарии оболочки повторно используют целые программы.
  • Оболочка доступна повсеместно (в чем-нибудь вроде Unix) - Python не обязательно установлен.

Это правда, что в Python можно делать все, что можно делать в оболочке; Верно также и то, что есть вещи, которые легко сделать в Python, но которые сложно в оболочке (точно так же, как есть вещи, которые легко в оболочке, но сложно в Python). Знание того и другого будет лучшим в долгосрочной перспективе.


17
1 и 2, хорошие моменты. №3 - это слабость, так как она приводит к большим накладным расходам, которых можно избежать с помощью Python. №4 может быть в значительной степени неверным. Python сейчас является частью большинства дистрибутивов Linux.
S.Lott

1
@Svante: напишите простой цикл оболочки для выполнения ряда операций с использованием таких команд, как «test» и «expr», и сравните время выполнения со сценарием Python, который использует модуль «os». Такие команды, как test и expr, часто включают разветвление подпроцесса для выполнения реальной работы.
S.Lott

2
Я считаю пункт 3 огромным преимуществом, а не недостатком. Например, рассмотрите возможность изменения размера каталога, полного изображений, с помощью программы преобразования.
Гленн,

7
Также следует отметить, что в отношении №4 bashоболочка не является универсальной для всех дистрибутивов Linux, в частности для встроенных систем и других, на которых busyboxвыполняется исполняемый файл. Сценарии, нацеленные на саму оболочку Bourne, с которой bashимеет обратную совместимость, будут работать на всех POSIX-совместимых системах, однако этот язык гораздо более ограничен, чем тот, который реализован в bash.
интуитивно понятен

5
@intuited: eval "$ (history 2 | head -1 | perl -pe 's / (? <= который) более вероятно / по крайней мере /')"; history -d $ (history 2 | head -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
интуитивно понятен

54

«Какие сильные стороны сценариев оболочки делают их незаменимым инструментом по сравнению с Python?»

Оболочка не обязательна. Как вы думаете, почему их так много? bash, tcsh, csh, sh и т. д. и т. д.,

Python - это оболочка. Не тот, который вы бы использовали для выполнения всех команд, но для написания сценариев он идеален.

Python - более или менее стандартная часть всех дистрибутивов Linux.

Более традиционные снаряды делают слишком много вещей.

  1. У них есть удобный пользовательский интерфейс для выполнения команд. Это включает однострочные команды, в которых оболочка ищет ваш PATH, разветвляет и запускает запрошенную программу. Она также включает в себя трубопроводы, последовательности и параллельных программ ( с использованием ;, |а &), а также некоторые перенаправления ( с помощью >и <).

  2. У них есть жалкие маленькие возможности, подобные языку программирования, для запуска скриптов. Этот язык довольно сложен в использовании и крайне неэффективен. Большинство операторов этого языка требуют разветвления одного или нескольких дополнительных процессов, тратя впустую время и память.

Запуск программ из оболочки, перенаправление stderr в файл журнала и тому подобное - это хорошо. Сделайте это в оболочке.

Почти все остальное можно сделать более эффективно и понятно с помощью скрипта Python.

Вам нужно и то, и другое . Однако никогда не следует писать сценарий с операторами if или циклами на традиционном языке оболочки.


1
@intuited. А) Распространение различных оболочек свидетельствует о количестве особенностей, которые срастаются в «оболочку»; не это важная роль, но это всеобъемлющая функция. Б) Интерпретатор python - это подходящая оболочка unix, он использует # !. C) «Простой» ifоператор оболочки часто включает запуск testпрограммы. Оболочка - убогий язык программирования во всех отношениях.
S.Lott

4
@S. Лотт: Похоже, здесь присутствует некоторый семантический диссонанс. Мое определение оболочки UNIX - это интерпретатор, язык которого в первую очередь ориентирован на управление на высоком уровне работой системы UNIX. Согласно этому определению, оболочка определенного типа, безусловно, необходима для работы системы UNIX, а Python не подходит. Как бы вы определили этот термин?
интуитивно понятен

1
@ S.Lott: Я не большой поклонник синтаксиса, который используется в традиционных сценариях оболочки, но я считаю его вполне полезным и подходящим во многих ситуациях, когда основной целью является управление процессами и потоком их вывода. Это часто требует принятия решений и повторения. Современные оболочки ( bashпо крайней мере) имеют встроенные средства для обработки принятия решений (например, testявляются bashвстроенными в дополнение к более универсальным конструкциям). У него, безусловно, есть свои слабые стороны, но также и свои сильные стороны. Это также стоит изучить подробно, потому что это совсем другая парадигма, чем другие типы языков.
интуитивно понятен

1
@intuited: «найти его вполне пригодным для использования» - это приветствие вашего мастерства, а не грязный язык. Python может быть более удобным для людей не столь опытных.
S.Lott

3
@ S.Lott: Интересно, у вас совсем другая философия, чем у меня. Я считаю, что дизайн и операции - это в основном цыплята и яйца. Это означает, что сценарий оболочки - это программа, которая запускает программы. Многие из этих программ изначально были реализованы как все более сложные сценарии оболочки. В какой-то момент стало целесообразно, вероятно, не только ради эффективности, но и ради модульности, переписать некоторые из них на C, а позже и на Python. Например: в какой-то момент cat "$1" | ssh "$2" "cat - >\"$1\""родился scp. Они знали, как лучше всего его спроектировать, потому что уже использовали его.
интуитивно понятен

32

Оболочка делает общие и простые действия действительно простыми за счет того, что более сложные вещи становятся намного сложнее.

Как правило, небольшой сценарий оболочки будет короче и проще, чем соответствующая программа на Python, но программа на языке Python будет склонна изящно принимать изменения, тогда как сценарий оболочки будет становиться все менее и менее обслуживаемым по мере добавления кода.

Это приводит к тому, что для оптимальной повседневной производительности вам нужны сценарии оболочки, но вы должны использовать его в основном для одноразовых сценариев и везде использовать python.


14

Нет ничего, что можно сделать со сценариями оболочки, чего нельзя было бы сделать с python. Большим преимуществом сценариев оболочки является то, что вы используете те же команды, что и при использовании оболочки, поэтому, если вы интенсивный пользователь оболочки, сценарии оболочки в какой-то момент станут очень быстрым и простым способом автоматизировать работу оболочки. .

Мне также легче работать с конвейерами данных в сценариях оболочки, чем в python, хотя это абсолютно выполнимо с python.

И, наконец, вам не нужно запускать дополнительный интерпретатор для запуска сценариев оболочки, что дает вам очень небольшое, но иногда заметное преимущество в скорости и использовании памяти.

Но опять же, сценарии Python намного легче поддерживать, поэтому я пытаюсь перейти с больших уродливых сценариев оболочки на сценарии Python именно по этой причине. С Python также проще выполнять обработку исключений и обеспечивать контроль качества.


9

не нужно изучать сценарии оболочки, как показывают все предыдущие ответы; но обучение никогда не бывает плохим. это действительно вопрос личных приоритетов. кому-то очень трудно сказать вам, что стоит вашего времени, а что нет.

большинство программистов обнаруживают, что изучение новых языков с каждым разом становится все легче. (то же самое можно сказать и о естественных языках), и чем раньше вы начнете, тем лучше.

плюс: изучение языка позволяет вам экстравагантно снимать его ограничения с позиции полного знания и знакомства. это, вероятно, не приведет вас к сексу, но может принести вам пиво от ваших сверстников!


8

Я согласен с большинством предыдущих ответов. Я считаю команды оболочки наиболее подходящими для выполнения задач, ориентированных на файловую систему (копирование и перемещение файлов, grep и т. Д.). На мой взгляд, Shell лучше, если вам нужно читать и писать в файл, поскольку одно >>file.txtперенаправление добавляется к файлу мгновенно, вместо того, чтобы, скажем, file=open('file.txt','a'); file.write()и т. Д.

В настоящее время для личного использования я смешиваю оба, создавая скрипт python и вызывая os.system ('command') или os.popen ('command') каждый раз, когда какое-либо действие в оболочке проще, чем в python.


6

Оболочка доступна везде. Если вы придерживаетесь относительно базового набора портативных функций, ваши сценарии могут работать на сотовых телефонах, беспроводных маршрутизаторах, DVR, нетбуках, рабочих станциях, больших железных серверах и т. Д. Python не обязательно входит в стандартную комплектацию многих систем, и в зависимости от среды его может быть сложно установить.

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

Оболочка также имеет несколько довольно мощных функций; Насколько я знаю, конвейеры - это действительно интересная управляющая конструкция, которая присуща только оболочке.


5

Еще одна вещь, которую следует учитывать при выборе сценариев оболочки Python, - это версия Python, которая будет работать на целевых машинах. RHEL5 (чтобы назвать его) будет существовать долгое время. RHEL5 застрял с Python 2.4. Есть много хороших библиотек, которые зависят от функциональности, добавленной в Python post-2.4.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.