Есть ли какая-либо польза для сценариев Bash?

55

Я только что закончил свой второй курс в качестве студента в университете, поэтому моих "реальных" знаний не хватает. Я изучил Java свой первый год, продолжил работу с Java и взял C и простую Bash скрипты моей второй. Этим летом я пытаюсь изучить Perl (помогите мне). В прошлом я немного ругался с Python.

Мой вопрос в том, что теперь у нас есть очень читаемые, очень перезаписываемые языки сценариев, такие как Python, Ruby, Perl и т.д., почему кто-нибудь пишет сценарии Bash? Есть что-то, что мне не хватает? Я знаю, что в моем linux-окне есть perl и python. Разве они не достаточно распространены? Есть ли что-то что проще сделать в Bash, чем в некоторых других hll?

  • 13
    Одно Кольцо, чтобы управлять ими всеми, Одно Кольцо, чтобы найти их, Одно Кольцо, чтобы привести их всех и в темноте связать их - Толкин
  • 9
    "Боже, помоги мне"? Что с этим? Perl не так сложно подобрать!
Показать ещё 5 комментариев
Теги:
scripting
comparison

18 ответов

48
Лучший ответ

Помимо всего прочего, bash полезен, когда большая часть того, что вы делаете, - это общение и обмен между различными программами (многие из которых также являются стандартными). И есть много окружений, где bash (или по крайней мере оболочка POSIX), но Perl и Python не являются.

И, конечно, вы должны различать интерактивные bash и скриптовые bash. Ubuntu недавно переключил свою скриптовую оболочку по умолчанию (#!/bin/sh) на тире, потому что это было намного быстрее. Тем не менее, bash имеет полезные интерактивные функции, черта не (zsh все еще лучше, ИМХО).

См. также Стоит ли изучать bash, когда я знаю Perl?

  • 0
    Спасибо за этот связанный вопрос; очень полезно.
  • 3
    Немного соли: теперь Python поставляется практически со всеми дистрибутивами Linux, а также с Mac OS X. Что касается Windows, я бы предположил, что установка bash менее проста, чем установка Python…
Показать ещё 2 комментария
29

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

ИЗМЕНИТЬ googling вокруг:

Я хотел бы также упомянуть, что TextMate успешная программа OS-X содержит много bash машин внутри.

  • 0
    Можете ли вы дать мне более конкретные примеры? Или только один даже? Я не «осуждаю» Баша, я действительно пытаюсь понять, для чего люди на самом деле его используют.
  • 0
    Извините за тон, который у меня был, но на самом деле я имею в виду не то, что вы плохо говорите о Баше, а просто то, что я не думаю, что пришло время судить об этом как о "готовом к отставке". :)
Показать ещё 4 комментария
21

Bash сценарии позволяют автоматизировать задачи командной строки, используя тот же язык, если вы вручную вводите команды.

Тривиальный пример для списка $PATH

Bash

#!/bin/sh
echo $PATH

Python

import os
print os.getenv("path")
  • 2
    Итак, используйте bash, потому что вам не нужно помещать переменные окружения в кавычки ...?
  • 7
    Я хотел сказать, что один и тот же язык используется в скриптовом и интерактивном режимах (для bash).
Показать ещё 3 комментария
21

Реальная разница между bash и python заключается в том, что python является языком сценариев общего назначения, а bash - это просто способ запускать множество небольших (и часто очень быстрых) программ из серии. Python может это сделать, но он не оптимизирован для него. Программы (sort, find, uniq, scp) могут выполнять очень сложные задачи очень просто, а bash позволяет этим задачам взаимодействовать очень просто с конвейерами, вымыванием вывода из файлов или устройств и т.д.

Пока Python может запустите те же программы, вы будете вынуждены выполнять bash скрипты в python script, чтобы выполнить одно и то же, а затем вы застряли как с python, так и с bash. Оба прекрасно подходят им самим, но их смесь не улучшает ничего ИМХО.

11

Для множества задач bash может быть очень кратким. Код для поиска строки во всех файлах текущего каталога и печати этих строк:

В bash:

grep -ir "search_term" .

В Python:

for file in os.listdir('.'):
  file_content = open(file).readlines().split('\n')
  for line in file_content:
    if line.count("search_term") > 0:
      print file, ": ", line
8

Я думаю, что сильный аргумент, что python не так естественен, как bash для многих задач, - это простой факт, что никто не использует интерпретатор python в качестве своей оболочки. Ясно, что это возможно:

python> import os, subprocess
python> os.chdir(os.path.expanduser("~/work"))
python> subprocess.call(["vim","README"])

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

  • 0
    Оболочки Perl, с другой стороны, существуют, смотрите Zoidberg search.cpan.org/~pardus/Zoidberg-0.94/lib/Zoidberg.pm
  • 0
    Даже этот пример не работает, поскольку «~» - это расширенная переменная оболочки.
Показать ещё 1 комментарий
6

Ну, когда вы пишете с помощью bash, вы можете напрямую использовать все возможные инструменты в командной строке для вашего script. С любым другим языком вам сначала нужно выполнить эту команду и получить результат и т.д. Простой script, который (например) получает список процессов, проходит через grep и получает некоторый результат, будет намного сложнее на других языках, Таким образом, bash по-прежнему является хорошим инструментом для написания быстрых вещей.

4

Помимо того, что говорили другие, я хотел бы указать, на мой взгляд, основную причину изучения Bash: это (почти) стандартная Linux оболочка.

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

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

4

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

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

Кроме того: даже если такие языки, как Perl, Python и Ruby становятся все более и более повсеместными, единственным языком, который вы практически гарантируете в каждой unix-подобной системе, является bourne shell ( "хотя это необязательно в форме bash).

2

Если вы делаете много файлов GUI, вы, вероятно, встретитесь только bash, когда вы делаете какую-то настройку на своей собственной машине. Различные хаки и прочее. Если вы используете командную строку для работы, bash просто незаменим. Фактически, для командной строки требуется bash или другое знакомство с оболочкой.

Я получаю мили, узнав bash, когда захочу быстро передвигаться по своему жесткому диску. Я написал интерфейс навигации/меню, который позволяет быстро и легко переключаться на разные папки и файлы. Запись в bash была простой и простой. И там много легкодоступных и бесплатных вещей, которые покажут вам, как.

Кроме того, обучение bash отлично подходит для понимания того, как действительно работает Unix и некоторые из основных продуктов - и как далеко мы пришли с такими инструментами, как Python.

2

Легче, наверное, нет. Во многих случаях я предпочитаю perl для bash скриптов. Однако у bash есть одно преимущество, особенно в системах Linux: все это гарантирует, что он будет установлен. И если это не так, его в значительной степени совместимый отец (sh) будет, потому что почти все системные сценарии написаны для sh. Даже perl не является вездесущим, и это все происходит где-то.

2

Bash - это не только язык сценариев, но и оболочка.

Языки управления работой и оболочки
Основная статья: Shell script

Основной класс языков сценариев вырос из автоматизации работы контроля, который относится к управление поведением системы программы. (В этом смысле можно было бы думать о оболочках как о потомках IBM JCL или Язык управления заданиями, который использовался именно для этого цель.) Многие из этих языков, переводчики дублируются в командной строке интерпретаторы, такие как оболочка Unix или MS-DOS COMMAND.COM. Другие, такие поскольку AppleScript предлагает использовать Английские команды для сборки скрипты. Это в сочетании с Mac OS X Cocoa рамки позволяют пользователю создавать целые приложения с использованием AppleScript и Cocoa.

Python, Ruby и Perl великолепны, но являются более общими инструментами; в некоторых случаях (встроенные устройства или другие минималистические системы) их можно считать раздутыми или в других ситуациях они могут представлять угрозу безопасности (для сред, где требуется очень высокая безопасность, и пытаться устранить любой ненужный пакет).

В некоторых случаях сценарии оболочки будут работать намного лучше благодаря более тесной интеграции с ОС.

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

1

То, что я не понимаю, - это то, почему люди говорят bash, когда они подразумевают любую совместимую оболочку bourne-shell.

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

И да, сегодня существует много возможностей для сценариев оболочки, поскольку оболочка всегда существует во всех unixes, вне зависимости от perl, python, csh, zsh, ksh (возможно?) и т.д. Большую часть времени они добавляют только дополнительное удобство или различный синтаксис для конструкций, таких как циклы и тесты. Некоторые из них улучшили функции перенаправления.

В большинстве случаев я бы сказал, что обычная ракета борна работает одинаково хорошо.

Типичная ловушка: if ! test $x -eq $y работает как ожидается в bash, который имеет более умный встроенный оператор "if", но "правильный" if test ! $x -eq $y должен работать во всех средах.

1

Как уже упоминалось, инструменты GNU велики и проще всего использовать в оболочке. Особенно приятно, если ваши данные уже находятся в линейной или табличной форме обычного текста. Как и в качестве примера, на днях мне удалось создать script для создания облака слова XHTML любого текстового файла в строках 8 Bourne Shell, который еще менее мощный (но более широко поддерживается), чем Bash.

1

Я парень perl, но число функций bash (или ksh), которые я использую и создаю на ежедневной основе, весьма значителен. Для чего-либо, я напишу perl script, но для навигации по структуре каталогов и, в частности, для управления переменными среды bash/ksh/... необходимы.

Опять же, особенно для переменных среды ничто не сравнится с оболочкой, и довольно много программ используют переменные среды. В Perl мне нужно написать псевдоним или функцию bash, которая вызывает Perl script, который выписывает временный bash script, который затем получает источник после выхода Perl, чтобы внести изменения в тот же среда, из которой я запускаю.

Я сделал это, особенно для тяжелой атлетики по переменным пути. Но нет способа сделать это только в Perl (или python или ruby ​​... или C-code, если на то пошло).

  • 0
    Манипуляции с env var кажутся мне недельным примером. Конечно, вы можете получить доступ к манипуляциям с env изнутри perl или чего-то еще; вы просто не можете экспортировать их обратно в bash. Это ограничение способа инкапсуляции переменных в каждой подоболочке, а не ограничение какого-либо конкретного языка.
  • 0
    @ Quantum7, я не понимаю «слабый пример». Я не считаю передачу измененных переменных env подпроцессам «манипулированием переменными среды», поэтому я не говорил об этом. Я не понимаю, как все остальное. Я никогда не говорил, что это вопрос языков - это, очевидно, вопрос уровня окружающей среды. Shell - это среда, а Perl - нет (сама по себе).
1

Вы можете получить настоящий bournesh поверх freshmeat (например, в Mac OS X/bin/sh не является истинным bournesh).

Как определить традиционную оболочку Bourne?... Простая проверка для часто недокументированной, но характерной функции: вы можете использовать circumflex ^ (caret) в качестве замены для | (Труба).

см.: http://www.in-ulm.de/~mascheck/bourne/

1

По моему опыту, Perl встречает что-то вроде 99% любой необходимости, которая может потребовать оболочки script. В качестве бонуса можно написать код, который работает в Windows без Cygwin. Если у меня не будет установки Perl в окне Windows, я хочу настроить таргетинг, я могу использовать PAR:: Packer или PerlApp для создания исполняемого файла. Python, Ruby и другие должны работать так же хорошо.

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

Узнайте, как читать и устанавливать переменные. Как создавать и вызывать функции. Как загрузить другие файлы. Узнайте, как работает управление потоком.

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

Итак, да, базовая оболочка стоит изучить.

1

Bash (и оригинальные производные Bourne sh и myriad) - с одной точки зрения - невероятно высокоуровневый язык. Там, где многие языки используют простые примитивы, примитивы оболочки представляют собой целые программы.

Чтобы это не было лучшим языком для выражения ваших задач, это не значит, что он мертв, умирает или даже умирает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню