В чем разница между #! / Bin / sh и #! / Bin / bash?

bash (от англ. Bourne again shell , каламбур «Born again» shell  — «возрождённый» shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Одна из наиболее популярных современных разновидностей командной оболочки UNIX. Особенно популярна в среде Linux, где она часто используется в качестве предустановленной командной оболочки.

Как работают bash скрипты в ОС Linux

Это такая командная оболочка, где вы имеете возможность производить разные команды, которые начнут на высокой скорости и плодотворно осуществлять разные работы. Абсолютно вся мощь ОС linux в применении терминала. Поэтому, чтобы не набирать одни и те же команды несколько раз можно использовать скрипты. Это очень удобно, вы просто объединяете несколько команд, которые осуществляют некоторое воздействие, а затем выполняете их одной и той же командой или даже с помощью ярлычка. Для операционной системы linux было создано много скриптов, которые исполняются в разнообразных командных оболочках. Ну в принципе, вы очевидно это уже понимаете.

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

В этом случае не нужно даже флага исполняемости. Взамен подобного, применяются сигнатуры начала файла и специальные флаги. У нас есть несколько различающихся методов произвести включение script-a в ОС Linux. В ОС Linux практически не применяется расширение файла для определения его вида на системном уровне. Это могут делать файловые менеджеры и то не всегда. Операционная система считает исполняемыми только те файлы, которым присвоена характеристика исполняемости. Это обыкновенные файлы, которые содержат в себе текст.

ответа

В Linux и других Unix-подобных системах у вас есть выбор из нескольких оболочек.

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

bash — наиболее распространенная оболочка, используемая в качестве оболочки по умолчанию для пользователей систем Linux. Это духовный потомок других снарядов, используемых во всей истории Unix. Его имя, bash — это аббревиатура от Bourne-Again Shell, дань уважения оболочке Bourne, которую она была предназначена для замены, хотя она также включает в себя функции от C Shell и Korn Shell.

Это запущено, эти дней, из /bin/bash — любая система с bash будет доступна здесь.

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

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

В верхней части скрипта оболочки можно указать оболочку его следует запускать с помощью shebang. Сценарий может указывать #!/bin/bash в первой строке, что означает, что скрипт должен всегда запускаться с bash, а не с другой оболочкой.

Читайте также:  Как проверить наличие открытых портов в Linux

/ bin / sh — это исполняемый файл, представляющий bash . Фактически, он обычно реализуется как символическая ссылка, указывающая на исполняемый файл, в зависимости от того, какая оболочка является оболочкой системы. Системная оболочка представляет собой оболочку по умолчанию, которую должны использовать системные сценарии. В дистрибутивах Linux в течение долгого времени это обычно было символической ссылкой на bash, так что это стало скорее соглашением всегда связывать / bin / sh с bash или bash-совместимой оболочкой. Однако в последние пару лет Debian (и Ubuntu) решили переключить системную оболочку с bash на bash — похожее разорение оболочки с давней традицией в Linux (ну, GNU) использования bash для / bin / sh. Dash рассматривается как более легкая и намного более быстрая оболочка, которая может быть полезной для скорости загрузки (и других вещей, требующих большого количества сценариев оболочки, например сценариев установки пакетов).

Dash довольно хорошо совместим с bash, основываясь на одном и том же стандарте POSIX. Однако он не реализует расширения, связанные с bash. Существуют сценарии, которые используют #!/bin/sh (системная оболочка) как их shebang, но которые требуют базовых расширений. В настоящее время это рассматривается как bash для Debian и Ubuntu, которые требуют, чтобы / bin / sh мог работать, когда указали на тире.

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

/ bin / sh

Если ваш скрипт требует функций, поддерживаемых только bash, используйте #!/bin/bash.

Но если это вообще возможно, было бы хорошо убедиться, что ваш скрипт POSIX -compatible и использовать #!/bin/sh, который должен всегда, достаточно надежно, указывать на предпочтительную совместимую с POSIX системную оболочку при любой установке.

60 ответ дан thomasrutter 25 May 2018 в 10:59 поделиться

В дополнение к предыдущим ответам, даже если /bin/sh является символической ссылкой на /bin/bash, #!/bin/sh не является полностью эквивалентным #!/bin/bash.

Из bash (1) человек page:

«Если bash вызывается с именем sh, он пытается как можно ближе имитировать поведение при запуске исторических версий sh, а также соответствовать стандарту POSIX».

Например, синтаксис bash:

exec > >(tee )

дает ошибку в оболочке, начинающейся с #!/bin/sh, даже с символической ссылкой sh-> bash.

15 ответ дан muru 25 May 2018 в 10:59 поделиться

Использование Bash и ch

Название bash является аббревиатурой от Bourne Again SHell. Эта аббревиатура указывает на то, что bash наследует интерпретатор Bourneshell (команда sh), созданный Стивом Борном (Steve Bourne) из AT&TBell Labs. Брайан Фокс (Brian Fox) из Free Software Foundation создал bash в составе проекта GNU. В дальнейшем разработка перешла в руки Чета Рами (Chet Ramey) в Case Western Reserve University.

Интерпретатор bash содержит возможности, которые разрабатывались для интерпретаторов sh и ksh во времена ранних версий UNIX, а также ряд возможностей интерпретатора csh.

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

Большинство примеров в этой

Что такое bash

Bash расшифровывается как Bourne again shell (что можно перевести как «Еще одна оболочка Борна»), название частично заимствованно от более ранней версии командной оболочки UNIX, которая называлась просто Bourne shell («Оболочка Борна» – по фамилии разработчика Стивена Борна).

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

Обработка большого количества аргументов командной строки в Bash

Даже обработка двух флагов сопряжена с трудностями. Качества кода выше значительно ухудшится, если аргументы могут указываться в произвольном порядке. Но даже без этого, для обработки трёх стартовых условий (-a, -c, -o) перед операцией сдвига понадобится проверка всех вариантов. Потом еще раз проверка и сдвиг. И еще раз проверка и сдвиг. Кроме того, пользователи любят комбинировать опции запуска программы между собой. Представьте, как ужасно разбирать на составные части входные данные вида -ac -o или -aco.

Введение в getopt

Если необходимо создать объёмный сценарий с большим набором опций запуска, то использование программы getopt – одно из лучших решений. С помощью этой утилиты можно легко разобрать на составные части различные флаги и значения, скомбинировать их, а затем обработать удобным способом в одном месте.

Алгоритм применения getopt выглядит следующим образом:

  1. Разбор существующих аргументов командной строки с помощью getopt. В результате будет создана временная переменная с отсортированными данными по заданному шаблону.
  2. Замена аргументов на новые командой set.
  3. Последовательная обработка полученных значений в цикле.

Наглядно продемонстрировать эту последовательность действий можно на простом примере. Предположим, что существует скрипт, ход выполнения которого задаётся тремя опциями: -s, -p и –t.

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

args=$(getopt sp:t $*)

При сравнении с обработкой ошибок (показана ниже) можно заметить, что первый параметр для getopt – это список всех допустимых флагов. С помощью : указывается, что после аргумента следует еще один обязательный.

Затем можно проверить значение переменной $? – статус выполнения последней операции. Если при обработке утилитой getopt параметров возникла какая-то ошибка, то её значение будет отличаться от 0. В этом случае можно вывести подсказку по использованию программы и завершить выполнение:

if [ $? != 0 ] ; then echo "Использование: $(basename $0) {-p SFX} {-n} {-t}" echo " -s выводить число подходящих файлов" echo " -p использовать суффикс SFX для имён файлов" echo " -t режим тестирования – не выполнять реальных действий" exit 0 fi

На практике часто встречаются скрипты, в которых подобная подсказка заключена в отдельную функцию. Так исходный код лучше воспринимается. Следует отдельно отметить выражение $(basename $0) — оно отделяет имя запущенной программы от полного пути к исполняемому файлу.

После обработки ошибок продолжаем выполнять полезные действия:

set — $args

Теперь все аргументы отсортированы и готовы к обработке. Производится она обычно с помощью конструкции case, заключённой в цикл. Выглядит это следующим образом:

i=0 for i do case "$i" in -s ) flag_s=1 ; shift ;; -p ) flag_p=1 ; sfx=$2 ; shift 2 ;; -t ) flag_t=1 ; shift ;; esac done

Здесь используется нестандартный синтаксис работы с case. Двойное ; (;;) применяется для завершения последовательности действий для определённого условия. Это выполняет декоративную функцию и упрощает восприятие исходного кода.

Несколько основных команд bash

Рассмотрим наиболее популярные команды:

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

cd /home/YOUR_USER_NAME или проще: cd ~

Читайте также:  Mandrakelinux 10.1. Справочное руководство. Заключительно слово

Соответственно команда cd позволяет перейти в каталог, который расположен выше.

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

Как это работает?

К примеру, вы хотите получить доступ к каталогу, у которого очень длинное название — freebestwebhosting. Нет потребности полностью вводить название выбранного каталога. Достаточно просто ввести «free», после этого нажать «tab», это позволит интерпретатору самостоятельно дополнить выбранную вами команду.

Команда CAT

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

cat

Команда GREP

Есть потребность в проверке логов доступа на определенный сайт? Тогда команда GREP станет оптимальным вариантом. Как это работает? Вам необходимо проверить, чем занимался на вашем компьютере пользователь с ІР Для этого достаточно просто ввести команду:

cat /var/log/apache2/ | grep

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

Команда TAIL

Одна из наиболее полезных команд в Линуксе. Она позволяет оперативно просматривать изменяемые файлы в реальном времени. Можно получить доступ к необходимым вам логам без особых проблем и временных затрат. Чтобы просмотреть определенный лог в реальном времени, необходимо воспользоваться следующей командой:

tail -f /var/log/apache2/

Команда SSH

Данная команда является протоколом подключения к серверу. Формат команды, которая позволит оперативно подключиться к определенному серверу, выглядит следующим образом:

ssh [email protected] и нажмите enter.

Достаточно, чтобы выбранный сервер поддерживал подключение по ssh (что позволит оперативно получить к нему доступ) — необходимо просто ввести специальный пароль, чтобы пройти идентификацию. Вы сможете работать с оболочкой, которая установлена на вашем сервере, команда является невероятно полезной, позволяет существенно экономить свое время.

SSH имеет свой стандартный порт «22». Сегодня большинство администраторов пытаются надежно защитить свой сервер от посягательств посторонних людей, полностью закрывая доступ к нему через «порт 22». Создается альтернативный порт, позволяющий получать кратковременный доступ. От того, где именно размещен ваш сервер, напрямую зависит то, как будет выглядеть исходная команда. В данном случае, с отказом от стандартного и использованием альтернативного «порта 2213», команда будет выглядеть следующим образом:

ssh [email protected] -p2231

Использование операторов ++ и —

Операторы ++ и — увеличивают и уменьшают соответственно его операнд на 1 и возвращают значение.

((i++)) ((++i)) let «i++» let «++i»

((i—)) ((—i)) let «i—« let «—i»

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

  • приращение префикса: ++i
  • префиксный декремент: —i
  • постфиксное приращение: i++
  • постфиксный декремент: i—

Операторы префикса сначала увеличивают / уменьшают операторы на 1 а затем возвращают новое значение операторов. С другой стороны, постфиксные операторы возвращают значение операторов до того, как оно было увеличено / уменьшено.

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

Следующие примеры демонстрируют, как работает оператор ++ когда он используется до и после его операнта:

x=5 y=$((x++)) echo x: $x echo y: $y

x: 6 y: 5

x=5 y=$((++x)) echo x: $x echo y: $y

x: 6 y: 6

Ниже приведен пример использования постфиксного инкрементора в сценарии bash:

#!/bin/bash i= while true; do if [[ «$i« -gt 3 ]]; then exit 1 fi echo i: $i ((i++)) done

Недостатком использования этих операторов является то, что переменная может увеличиваться или уменьшаться только на 1 .