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


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

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

18 60

18 ответов:

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

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

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

Bash невероятно полезен в системном администрировании, развертывании веб-приложений, хрусте данных, сутомированных резервных копиях, даже getting-things-done day by day management лишь очень немногие из них. Я думаю, что для вас слишком рано судить "ветерана ИТ-солдат", как Баш.

изменить не прибегая к помощи вокруг:

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

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

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

bash скрипты позволяют автоматизировать задачи командной строки С помощью тот же язык вы бы если вы вводите команды вручную.

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

Баш

#!/bin/sh
echo $PATH

Python

import os
print os.getenv("path")

для многих задач, 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

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

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

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

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

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

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

кроме того: даже если такие языки, как Perl, Python и Ruby становятся все более и более распространенными, единственный язык, на котором вы практически гарантированный на каждой unix-подобной системе есть оболочки Bourne (хотя не обязательно в виде Баш).

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

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

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

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

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

языки управления заданиями и оболочки
Основная статья: скрипт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

при написании shell-скриптов: всегда попробуйте использовать конструкции,которые также работают в старых интерпретаторах Bourne shell. Когда-нибудь это избавит вас от многих неприятностей.

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

большую часть времени я бы сказал, что обычный Bourne shell работает одинаково хорошо.

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