(Я не уверен, что это уместный вопрос здесь)
Скрипты оболочки, как написанные в bash
, могут делать много вещей. Они могут вызывать программы Unix, направлять их вывод, перенаправлять ввод / вывод из / в файлы, управлять потоком, проверять, существует ли файл и т. Д.
Но современный язык программирования, например, python
и ruby
, также может делать эти вещи. И они (я думаю) более читабельны и ремонтопригодны.
bash
пользуется широким распространением. Но во многих дистрибутивах также установлен python
интерпретатор.
Так в чем же преимущество оболочки скрипта? Если бы я мог написать python
, ruby
или perl
, стоит ли учиться bash
?
programming-languages
shell
Лай Юй-Сюань
источник
источник
Ответы:
Оболочки имеют специальные функции для работы с файлами и передачи данных из одной программы в другую (при условии, что данные являются текстовыми). Для этих задач сценарии оболочки могут быть менее громоздкими, чем язык сценариев, такой как Python.
Сценарии оболочки также имеют то преимущество, что используемые вами команды - это в основном те же команды, которые вы использовали бы из командной строки - поэтому, если вы можете что-то делать в оболочке, вы более чем на полпути к сценарию той же операции.
Вот, например, скрипт bash, который перемещает все файлы PNG из текущего каталога в указанный каталог.
Вот версия Python.
Вы заметите:
mv
команды в bashsource
для запуска в том же экземпляре оболочкиglob.iglob("./*.png")
довольно глоток просто сказать*.png
Если вы хотите написать основную конвейерную операцию на Python, вы будете поражены многословием. (Конечно, некоторые вещи, такие как передача по каналу
grep
, могут быть заменены кодом Python, а не использованием внешней программы, поэтому вам часто не нужно передавать так много.)Как контрпример, мне однажды пришлось написать подпрограмму, которая проверяла, как долго каждое из имен файлов находится в определенном каталоге. Если они были длиннее, чем поддерживаются конкретной ОС, их пришлось сократить. Это может привести к дублированию имен файлов, которые мне нужно было исправить, и, поскольку они будут связаны с веб-страницей, сокращенные имена должны быть стабильными, т. Е. Они должны генерироваться таким образом, чтобы одно и то же длинное имя файла всегда приводило к то же самое сокращенное имя файла. Я сделал это, сгенерировав шестнадцатеричное md5 длинного имени файла и добавив первые четыре символа этого слова к сокращенному имени (имена могли все еще сталкиваться, но это было очень просто, поэтому я просто проверил это условие и кинул залог, если это произойдет) ,
Я сделал это в bash, потому что это было частью нашей системы сборки, которая уже была написана на bash. Это было точно так же сложно, как вы думаете. Написание на Python заняло бы намного меньше времени и, вероятно, было бы более понятным.
Вкратце: разные языки предназначены для разных задач; выберите язык, который вам больше всего подходит для выполнения поставленной задачи.
источник
mv *.png $1
(комментарии не сохраняют форматирование), но с perl вы также можете использовать языковые функции более высокого уровня.Существующие ответы также действительны, но есть одна причина, о которой еще никто не упомянул: потому что она будет там.
Любая данная установка * nix выполняется с некоторым набором дополнительных пакетов, которые могут загружаться или не загружаться, и не все системы будут иметь Python, Perl или Ruby. Но если ожидается, что система вообще будет иметь какие-либо интерактивные возможности, она будет иметь оболочку. Это означает, что сценарии оболочки будут работать в системах от серверов до рабочих столов программистов и секретарских рабочих столов тонких клиентов и встраиваемых устройств в любой системе, поддерживающей доступную для записи файловую систему и командную строку bash.
Для тех, кто работает только в согласованной серверной среде, это то, что можно воспринимать как должное, и это не так важно. Для тех, кто работает в более разнообразной среде, это не следует упускать из виду.
источник
На значительную часть вашего вопроса ответ здесь:
Вот выдержка из моего ответа на этот вопрос :
источник
Я бы сказал, что сценарий оболочки имеет преимущество в ситуациях, когда вы просто хотите создать сверхпростую автоматизированную задачу. Например, если вы хотите написать скрипт, который будет резервировать каталог с одного сервера на другой каждый день в 5:00, было бы излишним использовать язык программирования для работы в тяжелых условиях.
С другой стороны, если ваша задача программирования больше нуждается в управляющих структурах (если / то / еще), итеративных структурах (циклы), вводе / выводе базы данных и файлов и т. Д., То она, вероятно, лучше подходит для более способных язык программирования, чем сценарий оболочки.
Я думаю, что хорошее правило:
источник
shellScript() if automatingSimpleTask else programmingLanguage()
лол.Хотя вы можете запускать программы из python / ruby / любой другой программы, в оболочке все по-другому. Вам может понадобиться использовать API для запуска чего-либо - например, fork (). В сценарии оболочки программы ведут себя больше как функции на обычном языке программирования и могут быть выполнены, переданы по конвейеру и т. Д. С минимальными усилиями. Поток данных очень четкий, если использовать каналы.
источник
Если вы абсолютно свободны в выборе языка программирования, который вы используете для определенных задач, вы, вероятно, можете почти полностью избежать изучения bash и выполнять все задачи программирования сценариев с помощью Perl, Python или Ruby. Иногда это может привести к более подробному решению, особенно в случае, когда вам просто нужен сценарий, вызывающий последовательность других инструментов Unix, но в более сложных случаях вы правы, эти современные языки сценариев дают вам больше возможностей для написания лучшего обслуживаемого кода (они также дают вам больше возможностей для написания запутанного кода, но это ваш выбор).
С другой стороны, часто мы не свободны в выборе языка, который нам нравится больше всего, потому что мы должны работать с устаревшим кодом или кодом, написанным тем, кто знал bash, но не знал ни один из языков сценариев, которые вы назвали.
источник
Сценарии оболочки - это интерпретируемый язык программирования. Вот несколько причин, по которым я решил писать скрипты на bash, а не на perl или python или каком-либо другом языке сценариев:
Работает везде : более сложные интерпретаторы могут быть не всегда доступны, например, при запуске системы или во встроенных системах. Bash доступен даже в busybox.
Работает в командной строке : если вы хорошо разбираетесь в сценариях оболочки, вы можете использовать эти навыки для выполнения сложных задач в специальных сценариях прямо в командной строке. Я использую этот навык ежедневно в качестве системного администратора.
Проще писать программы, которые вызывают другие программы: если то, что вы пытаетесь сделать, состоит в том, чтобы соединить несколько существующих программ интересными способами, это может быть проще сделать в сценарии оболочки, чем с языком более высокого уровня.
Если в программе 30 строк или меньше, я обычно пишу ее, используя сценарии оболочки. Если есть какие-либо сложные манипуляции или сложные или анализ для решения, я сделаю это с помощью Python или Perl.
источник
Вы должны взглянуть на coffeescript. Их слова:
Золотое правило CoffeeScript гласит: «Это просто JavaScript».
Ну ... вот и ответ супер-новичка.
Как начинающий с самообучением в течение последних 6 месяцев, и немного пробовал C, C ++, Javascript и другие Bashscript в последние дни ... Я могу вам сказать:
и это не просто фантастика! ? циклы и переменные? Вот это да!
Пожалуйста, скажите мне, где вы видите это? Я написал bashscript в gedit даже в geany, и я могу отформатировать (табы?), И я читаю свой код со скоростью света, используя bashscript для сравнения на других языках.
Есть ли у этих языков другие инструменты для поддержания порядка? Я знаю, что объектно-ориентированный сохранить много кода, но ... люди говорят, что bashscript тоже ОО! ВАУ 2! Это моя точка зрения здесь. Собираюсь:
в этом вопросе: как сделать то, что может сделать эта чушь в perl, phyton или ruby? Это просто?
( bashdamnthing = xdotool )
источник