Bash vs sh


Что такое bash / shell / Хабр

И то, и другое — интерпретаторы командной строки в линуксе. То есть если вы откроете командную строку и введете любую команду, да хоть:

cd /home

То именно интерпретатор ее расшифрует и скажет компьютеру «он хочет перейти в директорию /home». Компьютер ведь не понимает команды на русском / английском языке. Ему нужны байтики. Этим и занимается интерпретатор — переводом с «нашего» на «компьютерный» язык.

Так что «cd /home» — это shell-команда! Или bash. Смотря какой интерпретатор установлен в вашей системе. В каждой операционной системе установлен интерпретатор по умолчанию. У них есть какие-то различия, но есть и набор базовых команд, которые понимают все: cd, mv, cp, ls… (в винде эти команды немного другие)

А что такое shell-скрипт тогда? Это просто текстовый документ, внутри которого написан набор команд! Это не обязательно должны быть «сложные» команды, которые делают что-то супер-навороченное. Это любые команды, которые вы выполняете в консоли.

См также:

Основные linux-команды для новичка — что можно выполнять в консоли

Например, создадим скриптик, который создаст директорию и в ней файлик:

mkdir /home/test cd /home/test touch test.txt

Так, команды записали, осталось сохранить их в файлик. Скрипты хранят в файлах с расширением .sh, поэтому назовем файл first_script.sh. Но есть нюанс — линуксу плевать на ваше расширение файла. Его может вообще не быть, и все равно скрипт останется скриптом. Почему? Потому что у любого скрипта в первой строке должен содержаться путь к интерпретатору. Например:

#!/bin/bash или #!/bin/sh

Весь файл целиком:

#!/bin/bash mkdir /home/test cd /home/test touch test.txt

И даже если у такого файла не будет расширения вовсе, его можно будет запустить как скрипт:

sh first_script # Проверяем директорию /home — там появилась папка test с файлом test. txt внутри.

Расширение .sh ставится для понимания человеком. Зашел в директорию:

— Ага, что тут у нас? Файлы sh, скрипты какие-то лежат...

Скрипты могут быть простые, а могут быть сложные. Вот, например, в одном проекте мы вначале вручную обновляли тестовые платформы. Для обновления надо:

  1. Остановить сервис.

  2. Переподложить war-файл с приложением (лежат они в директории /opt)

  3. Запустить сервис

Сервиса два, допустим это test и cloud. Так что шагов уже 6.

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

#!/bin/bash service test stop cp test.war /opt/jboss-test/bin service test start service cloud stop cp cloud.war /opt/jboss-cloud/bin service cloud start

Собираешь приложение, подкладываешь к скриптику и запускаешь 1 команду вместо 6. Удобно! Это называется «автоматизация рутины» =)

Другой пример с того же проекта — мы делали серверное приложение. И во время установки приложения на сервере linux нужно выполнить пункты по настройке самой системы. Например, увеличить параметр max_map_count — сколько максимум памяти может использовать процесс.

Приложение в пике работы требует много памяти. Если не настроить параметр, то «тяжеловесная» задача просто упадет с ошибкой «Не хватает памяти». И если мы видим такую ошибку, то в первую очередь идем проверять настройки системы.

Вообще, если вы отдаете установку приложения на откуп «чужим» админам, лучше потом проверять — а всё ли настроено верно? Конечно, обычно на production (машина, с которой работают реальные пользователи) настраивают всё внимательно, это на тестовых стендах могут что-то пропустить... Но лучше перебдеть!

Мы написали скрипт по проверке настройки окружения (символ «#» в начале строки означает, что это комментарий):

#!/bin/sh # # check sysctl # if [ -f /proc/sys/vm/max_map_count ] && [ $(cat /proc/sys/vm/max_map_count) -ge 16777216 ]; then echo "vm. max_map_count: ok" else echo "vm.max_map_count: failed" fi if [ -f /proc/sys/vm/overcommit_memory ] && [ $(cat /proc/sys/vm/overcommit_memory) -eq 2 ]; then echo "vm.overcommit_memory: ok" else echo "vm.overcommit_memory: failed" fi if [ -f /proc/sys/vm/overcommit_ratio ] && [ $(cat /proc/sys/vm/overcommit_ratio) -eq 100 ]; then echo "vm.overcommit_ratio: ok" else echo "vm.overcommit_ratio: failed" fi if [ -f /proc/sys/vm/swappiness ] && [ $(cat /proc/sys/vm/swappiness) -le 10 ]; then echo "vm.swappiness: ok" else echo "vm.swappiness: failed" fi 

В итоге админы настраивают окружение, а потом мы даем им скрипт, просим запустить его и прислать результаты. Я запустила скрипт на «голой» системе, где, разумеется, параметры настроены не были, и вот ответ:

Видим, что все проверки провалились, статус failed. Если и от админов приходит похожая картина, направляем их в документацию по настройке системы. Если к нам приходят с проблемой падения из-за нехватки памяти, снова просим выполнить скрипт. Так проще локализовать ошибку: это в приложении косяк, или окружение настроено плохо?

Просить других людей выполнить 10 команд не очень хорошо. Потому что часть команд может «потеряться» при выполнении — плохо скопировал, забыл выполнить проверку, которую дали сообщением позже... Гораздо проще сделать 1 скрипт и попросить выполнить именно его.

Когда надо писать скрипт?

По сути своей, bash-скрипты — это та же автоматизация. А когда нужна автоматизация? Когда мы хотим избавиться от рутины, от постоянного выполнения одного и того же действия вручную. Повторяете одно и то же каждый день / неделю? Напишите скрипт. Даже если он на 2-3 строчки будет, это правда удобнее. Поверьте, сама делала небольшие скрипты =)

См также по bash:

Википедия

Что такое shell и зачем он нужен

Основы BASH. Часть 1 (Хабр) — цикл статей о том, как писать скрипты

Bash-скрипты: начало — цикл статей по скриптам

См также другие статьи из цикла «Что такое. ..»:

Что такое API

Что такое клиент-серверная архитектура

Что такое CI (Continuous Integration)

Что такое транзакция

Что такое XML

Что такое регулярные выражения (regexp)

PS — больше полезных статей ищите в моем блоге по метке «полезное». А полезные видео — на моем youtube-канале

Сравните оболочек sh и Bash

Любая современная операционная система UNIX/Linux поставляется с установленными по умолчанию оболочками sh и Bash. Хотя оба они очень похожи по своей природе, один предлагает больше, чем другой.

В этой статье подробно рассматриваются различия и сходства между оболочками sh и Bash.

 

Оболочка Linux

В Linux оболочка — это специальная программа для интерпретации команд. Он интерпретирует командный язык и сообщает системе выполнять описанные задачи. Он не является частью ядра, но может выполнять такие задачи, как запуск программ и создание файлов.

Функциональность оболочки лучше понять на примере. Откройте терминал в вашей системе и выполните следующую команду:

$ date

 

Здесь мы отметили следующее:

  • Оболочка по умолчанию приняла команду «дата», интерпретировала ее и запустила инструмент даты.
  • Он также распечатал вывод на экране консоли.

Оболочки также могут поставляться со своими языками. Сценарии Bash, например, эффективны в автоматизации очень сложных задач и достижении чудес.

Для платформы Linux доступно множество оболочек. Очевидно, что наиболее популярной является оболочка Bash. Вот несколько альтернативных оболочек, на которые стоит обратить внимание:

  • Zsh с Oh My Zsh
  • Fish shell

 

Оболочка Bourne (sh)

Оболочка Bourne является оболочкой по умолчанию для версии 7 UNIX. Первоначально разработанный Стивеном Борном в Bell Labs, он был заменой оболочки Томпсона. Оболочка Bourne начала свой путь в 1979 году. Узнайте больше об истории оболочки Bourne в Википедии.

Даже по сей день оболочка Bourne доступна почти во всех системах Linux. Расположение бинарника следующее:

$ which sh

 

UNIX-подобные системы по-прежнему имеют оболочку Bourne в /usr/bin/sh. Это может быть не оболочка Bourne, а символическая/жесткая ссылка на более совместимую оболочку. Вы можете проверить это, выполнив следующую команду:

$ file -h /bin/sh

 

Оболочка sh также является названием командного языка программирования. Этот язык описывается стандартом POSIX, которому должны следовать все UNIX и UNIX-подобные системы. Оболочка Bourne, которую мы обсуждали до сих пор, является одной из реализаций sh.

 

Оболочка Bourne Again (Bash)

Теперь мы подошли к современной оболочке, которую мы все знаем и любим — оболочке Bash, также известной как «Bourne Again Shell». Название представляет собой игру слов, указывающую на то, что оно заменяет оболочку Bourne.

Разработанный Брайаном Фоксом для проекта GNU, Bash является одновременно оболочкой UNIX и командным языком.  Впервые он был выпущен в 1989 году. С тех пор он является оболочкой входа по умолчанию для большинства дистрибутивов Linux. Узнайте больше об истории оболочки Bash в Википедии.

Bash является надмножеством sh, что означает, что он включает в себя функции sh и некоторые другие. Как язык, большинство команд делают то же самое, что и sh. Однако Bash не является POSIX-совместимой оболочкой, а скорее является диалектом языка оболочки POSIX. Bash предназначен для реализации части оболочки и инструментов IEEE POSIX спецификации IEEE POSIX (стандарт IEEE 1003.1).

Проверьте расположение бинарного файла оболочки Bash:

$ which bash

 

Различия между sh и Bash

Учитывая исторический контекст, у sh и Bash больше общего, чем различий, поскольку один является лучшей реализацией другого. Несмотря на это, вот некоторые заметные различия в функциях, которые следует знать.

 

Оболочка по умолчанию

В большинстве современных систем Bash является оболочкой по умолчанию.

 

Бинарное местоположение

Проверьте бинарное расположение обеих оболочек:

$ which sh $ which bash

 

Характерная черта

По сравнению с sh, Bash предлагает гораздо большую гибкость и синтаксис, похожий на современный язык программирования. Вот некоторые дополнительные функции, которые Bash предлагает по сравнению с sh :

  • Bash поддерживает завершение командной строки с помощью клавиши TAB.
  • Просмотрите историю команд, используя клавишу со стрелкой ВВЕРХ или «Ctrl + R».
  • Арифметический расчет без каких-либо сторонних инструментов
  • Ассоциативные массивы
  • Горячие клавиши
  • Поддержка настройки для презентации Bash по умолчанию
  • Переменные среды EPOCHSECONDS и EPOCHREALTIME
  • Расширения скобок

 

POSIX-совместимость

По умолчанию Bash не совместим с POSIX, тогда как sh. Однако мы можем запустить Bash в режиме, совместимом с POSIX, с помощью следующей команды:

$ bash --posix

 

Если вы пишете сценарий Bash, но вам нужен стандарт POSIX, используйте следующий код в начале:

#!/bin/bash set -o posix

 

Здесь команда set указывает Bash включить режим POSIX.

 

Простота использования

Bash предлагает более современный язык командной строки по сравнению с sh. В связи с этим вам будет удобнее использовать Bash.

 

Портативность

По сравнению с Bash, sh обеспечивает лучшую переносимость.

Поскольку sh совместим с POSIX, любая оболочка, поддерживающая POSIX, сможет запускать сценарии sh. Например, Bash может запускать сценарии sh в режиме POSIX.

 

Сценарии

Когда вы пишете скрипт на Bash, код гарантированно совместим только с Bash.

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

 

Заключение

В этой статье мы рассмотрели историю, сходства и различия между sh и Bash. Sh является предшественником Bash. Оба они доступны во всех современных системах UNIX/Linux. В то время как Bash предлагает более удобный и простой в использовании опыт, sh предлагает совместимость, переносимость и стандартизированный синтаксис/поведение.

Вы новичок в написании сценариев Bash? Эта статья по написанию сценариев Bash для начинающих охватывает все необходимое для написания сценариев Bash. Мы надеемся, что вы нашли эту статью полезной.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Разница между sh и bash

bash и sh — это две разные оболочки операционной системы Unix. bash — это sh, но с большим количеством функций и лучшим синтаксисом. Bash — это «Bourne Again SHell», улучшенная версия sh (оригинальная оболочка Bourne). Сценарии оболочки — это сценарии в любой оболочке, тогда как сценарии Bash — это сценарии специально для Bash. sh — интерпретатор командной строки оболочки Unix/Unix-подобных операционных систем. sh предоставляет несколько встроенных команд. bash является надмножеством sh. Shell — это интерфейс командной строки для запуска команд и сценариев оболочки. Оболочки бывают разных видов, так же как и операционные системы бывают разных видов. Итак, Shell — это интерфейс между пользователем и операционной системой, который помогает пользователю взаимодействовать с устройством.

sh:

 #!/bin/sh 

bash:

 #!/bin/bash 

Примечание:

  • Оболочка — это интерфейс между пользователем и операционной системой.
  • sh реализует интерфейс оболочки.
  • bash является надмножеством sh.

ш:

ш также называется Bourne Shell. sh — это командный язык программирования, описанный стандартом POSIX. Это для UNIX или UNIX-подобных операционных систем. Он имеет множество реализаций. В большинстве операционных систем sh реализуется такими программами, как dash, kash и оригинальный Bourne Shell. sh является предшественником bash. /bin/sh — фактическая ссылка на основные реализации. Это символическая ссылка в большинстве систем POSIX.

sh сам по себе не является языком программирования. Это просто спецификация. sh — подробное описание синтаксиса и семантики языка. Он не включает реализацию. sh написан как замена более ранним оболочкам UNIX. Синтаксис большей части такой же, как и синтаксис языка программирования ALGOL68.

Нам следует использовать sh, если мы хотим, чтобы наш язык был совместим с несколькими системами. Скрипт sh скорее всего будет работать на bash также без модификаций, поскольку bash обратно совместим с sh. sh — это самый переносимый язык сценариев, который работает в большинстве систем POSIX/Unix/Linux. Одним из преимуществ sh является то, что он гарантированно существует во всем, что относится к системе Unix.

bash:

bash также является командным языком программирования, как и sh. В настоящее время bash является оболочкой входа по умолчанию в большинстве операционных систем на базе Linux. Это расширенная версия системы sh для замены GNU оболочки Bourne. Мы также можем сказать, что bash — это язык программирования. Здесь думайте, как с Python, мы можем запускать Python в интерактивном режиме, и он ведет себя как оболочка, но мы также можем запускать программу Python в любой среде IDE.

bash является надмножеством sh. Это означает, что bash поддерживает функции sh и предоставляет больше возможностей, чем sh. Хотя большинство команд делают то же самое, что и sh. bash не является оболочкой, совместимой с POSIX. Это диалект языка оболочки POSIX. Bash может работать в текстовом окне и позволяет пользователю интерпретировать команды для выполнения различных задач. Он обладает лучшими и наиболее полезными функциями оболочек Korn и C, такими как управление каталогами, управление заданиями, псевдонимы и многие другие.

Подобно программному обеспечению GNU, bash предоставляет другие оболочки, включая версию csh, Bash является оболочкой по умолчанию. bash предназначен для реализации части оболочки и инструментов IEEE POSIX спецификации IEEE POSIX (стандарт IEEE 1003.1). Как и другие GNU, bash достаточно переносим. Это работает в любой системе на базе Linux/Unix, в которой есть bash в ожидаемом месте. bash более функционален, чем sh с точки зрения программирования и интерактивного использования.

Разница между sh и bash:

  • bash

    sh     

    • Bourne Again SHell
    • SHell
    • Developed by Brain Fox
    • Разработан Стивеном Р. Борном.0016
    • bash is the default SHELL
    • sh is the not default SHELL
    • #!/bin/bash
    • #!/bin/ sh
    • Он имеет больше функциональности с обновлением.
    • Имеет меньшую функциональность.
    • поддерживает управление заданиями.
    • не поддерживает управление заданиями.
    • bash не является допустимой оболочкой POSIX.
    • sh — допустимая оболочка POSIX.
    • Простота использования
    • не так просто, как bash
    9000
    • более портативный, чем bash.
    • Extended version of language
    • Original language
    • Bash scripting is scripting specifically for Bash
    • Shell scripting is scripting in any shell
    • поддерживает историю команд.
    • не поддерживает историю команд.

    оболочка - Bash/sh - разница между && и ;

    спросил

    Изменено 5 лет, 6 месяцев назад

    Просмотрено 76 тысяч раз

    Обычно я использую ; для объединения более одной команды в строке, но некоторые люди предпочитают && . Есть ли разница? Например, кд ~; cd - и cd ~ && cd - , похоже, делают то же самое. Какая версия более переносима, например. будет поддерживаться подмножеством bash, таким как оболочка Android или около того?

    • bash
    • оболочка
    • синтаксис
    • многоплатформенная

    Если предыдущая команда не удалась с ; запустится второй.

    Но с && второй не запустится. 9С

    но не помогло... ;)

    cd /tnp/test && rm -rf * безопасно... ;)

    2

    В cmd1 && cmd2 , cmd2 выполняется только в случае успешного выполнения cmd1 (возвращает 0).

    В cmd1 ; cmd2 , cmd2 выполняется в любом случае.

    Обе конструкции являются частью POSIX-совместимой оболочки.

    && означает выполнение следующей команды, если предыдущая завершилась со статусом 0. В противном случае используйте || т.е. выполняться, если предыдущая команда завершается со статусом не равным 0 ; выполняется всегда.

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

    1

    Команды разделены по ; выполняются последовательно независимо от их состояния завершения.


    Learn more

    Только новые статьи

    Введите свой e-mail

    Видео-курс

    Blender для новичков

    Ваше имя:Ваш E-Mail: