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

Вы можете настроить «Double Click Timeout» в All Settings -> Mouse and Touchpad -> ‘Double-Click Timeout’ и настроить ползунок на ваши личные предпочтения.

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

man bash : Чтобы отобразить всю инструкцию bash

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

man <ключевое слово>, например man ls выдает информацию о команде ls.

Каналы и фильтры

Оператор pipe ‘|’ (вертикальная полоса) — это способ отправки вывода одной команды в качестве входной для другой команды.

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

command1 | command2

Когда команда посылает свой выход в канал, принимающей стороной для этого выхода является другая команда, а не файл. На рисунке ниже показано, как команда wc подсчитывает содержимое файла, отображенного командой cat.

wc — это команда, которая принимает данные на входе и каким-то образом преобразует их вывод. Такие команды называются фильтрами и помещаются после Unix каналов.

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

Фильтры

Теперь давайте посмотрим на некоторые часто используемые команды фильтров. Мы будем работать с файлом под названием , который содержит около 1000 имен детей, и с файлом , который содержит имена нескольких фруктов.

  • grep или глобальное регулярное выражение ищет строки с заданной строкой или ищет шаблон в заданном входном потоке и выводит результат. Следующая команда прочитает все файлы и выведет все строки, содержащие либо слово ‘Tom’.
В чем разница между #! / Bin / sh и #! / Bin / bash?

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

  • Фильтр wc — это сокращение от количества слов (word count). Он читает список файлов и генерирует одну или несколько следующих статистик: количество новых строк, количество слов и количество байтов. Введем в wc вывод вышеприведенной команды grep для подсчета количества строк, содержащих слово ‘Tom’.
  • Фильтр sort сортирует строки в алфавитном или цифровом порядке.
В чем разница между #! / Bin / sh и #! / Bin / bash?

Команда cat сначала читает содержимое файла , а затем сортирует его.

  • Фильтр uniq означает «уникальный» и дает нам количество уникальных строк во входном потоке.

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

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

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

Книги

  • Анонимность и безопасность в Интернете. От «чайника» к пользователю Простым и понятным языком рассказано, как скрыть свое местонахождение и IP-адрес, используя анонимные сети Tor и I2P, посетить заблокированные администратором сайты, защитить личную переписку от посторонних глаз
  • Microsoft Windows 8. Первое знакомство Описаны основные нововведения в Windows 8. Рассмотрена установка системы как на физический компьютер, так и на виртуальный (VMware, VirtualBox).
  • Linux. От новичка к профессионалу. 2-е изд. Даны ответы на все вопросы, возникающие при работе с Linux: от установки и настройки этой ОС до настройки сервера на базе Linux. Материал книги максимально охватывает все сферы применения Linux
  • Joomla Руководство пользователя Эта книга — простое и эффективное учебное пособие по освоению и использованию системы управления контентом веб-сайта Joomla Отличное руководство для начинающих
  • Самоучитель Microsoft Windows 8 Описаны основные нововведения в Windows 8, особое внимание уделено использованию системы на планшете. Рассмотрена установка системы как на физический компьютер (стационарный, ноутбук, нетбук, планшет), так и на виртуальный (VMware, Virtual Box).

ответа

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

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

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

Читайте также:  Повышаем пользовательские привилегии в Linux

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

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

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

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

/ 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 поделиться

Чтение из STDIN

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

Баш вмещает трубопроводы и перенаправление посредством специальных файлов. Каждый процесс получает собственный набор файлов (один для STDIN, STDOUT и STDERR соответственно), и они связаны при вызове или перенаправлении. Каждый процесс получает следующие файлы:

  • STDIN — /proc/<processID>/fd/0
  • STDOUT — /proc/<processID>/fd/1
  • STDERR — /proc/<processID>/fd/2

Чтобы сделать жизнь более удобной, система создает для нас несколько ярлыков:

  • STDIN — /dev/stdin or /proc/self/fd/0
  • STDOUT — /dev/stdout or /proc/self/fd/1
  • STDERR — /dev/stderr or /proc/self/fd/2
Читайте также:  42 команды Linux которые вы должны знать

fd в дорожках выше обозначает дескриптор файла.

Чтение из STDIN

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

summary

Shell #!/bin/bash # Основное резюме моего отчета о продажах echo Here is a summary of the sales data: echo ==================================== echo cat /dev/stdin | cut -d’ ‘ -f 2,3 | sort

12345678 #!/bin/bash# Основное резюме моего отчета о продажах echo Here is a summary of the sales data:echo ====================================echo cat /dev/stdin | cut d‘ ‘ f 2,3 | sort

Давайте разберем это:

  • Строки 4, 5, 6 — Распечатайте заголовок для вывода
  • Строка 8 — cat файл, представляющий STDIN, вырезает установку разделителя на пробел, поля 2 и 3 затем сортируют вывод.

Как установить оболочку Bash в Windows 10

Перед установкой Bash следует обновить Windows 10 до последней версии 1607. Bash в Windows 10 будет доступен только после установки обновления Anniversary Update. Еще одним условием является использование 64-разрядной системы в редакции Home или Pro. В общем, если у вас 64-разрядная версия Windows 10 1607 (с установленным последним обновлением Anniversary Update), то можно приступить к активации Bash.

Для этого сначала включите режим разработчика. Зайдите в меню Пуск, выберите пункт Параметры, а затем Обновление и безопасность. Перейдите на вкладку «Для разработчиков» и включите опцию «Режим разработчика».

После система запросит, действительно ли вы хотите включить режим разработчика, нажмите «Да». Система начнет искать подходящий для вашего компьютера пакет разработчика и установит необходимые компоненты. Затем появится сообщение, что некоторые функции не будут работать до перезагрузки компьютера – перезагрузите систему, чтобы завершить установку.

Как установить оболочку Bash в Windows 10

После этого переходим непосредственно к установке Bash. Кликните правой кнопкой мыши на кнопку Пуск, откройте Панель управления и перейдите на вкладку «Программы и компоненты». Откроется окно Удаления и изменения программ — выберите «Включение или отключение компонентов Windows».

После нажатия на эту опцию откроется новое окно с выбором системных функций, которые мы можем добавить или удалить. В списке нужно найти пункт «Подсистема Windows для Linux (бета)».

Собственно эта опция содержит все элементы необходимые для установки и запуска консольного приложения Bash. Выберите её в списке и подтвердите установку нажатием на ОК. После появится новое окно «Компоненты Windows», в котором можно отслеживать процесс загрузки и установки необходимых файлов. Процесс активации займет буквально минуту, после чего система попросит перезагрузку – нажмите «Перезагрузить сейчас».

Основные команды

Команда интерпретатора Bash man

Отображает руководства по командам. К примеру, последующая команда выдаст вам все данные о команде cat:

$ man cat

Команда интерпретатора Bash cat

Cчитывает файл, переданный в качестве аргумента, с выводом его содержимого по стандартному каналу вывода. При передаче нескольких файлов в виде аргумента происходит вывод конкатенированного содержимого всех файлов.

Команда интерпретатора Bash echo

Осуществляет вывод своих аргументов по стандартному каналу вывода.

$ echo Hello World Hello World

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

Команда интерпретатора Bash head

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

$ head -50

Команда интерпретатора Bash tail

Работает аналогично head, однако читает строки с конца:

Основные команды

$ tail -50

Дополнительно есть возможность просматривания добавляемых к файлу строк в режиме реального времени, используя флаг -f:

$ tail -f

Команда интерпретатора Bash less

Позволяет перемещаться куску текста либо переданному файлу в обоих направлениях.

$ less $ ps aux | less

Кстати, о символе | мы расскажем ниже в блоке про команду интерпретатора Bash history.

Команды интерпретатора Bash true и false

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

$? — это переменная, содержащая выходной статус последней запущенной команды. Выходной статус — код возврата программы. В нашем случае 0 будет означать успешное выполнение программы, а любое значение, которое больше нуля, будет отражать факт возникновения ошибок в процессе выполнения. Кстати, именно по этой причине в интерпретаторе Bash истиной (true) считается 0, а ложью (false) — всё, что не ноль.

$ true $ echo $? $ false $ echo $? 1

Команда интерпретатора Bash grep

Служит для поиска переданной строки в указанном файле:

$ cat user:student password:123 user:teacher password:321 $ grep 'student` user:student password:123

Кроме того, может принимать несколько регулярных выражений и файлов для уточнения формата текста.

Команда интерпретатора Bash sed

Потоковый редактор, который преобразует входные текстовые данные. Используется для замены выражений следующим образом: s/regexp/replacement/g. К примеру, в следующем коде произойдёт замена всех слов «Hello» на «Hi»:

Читайте также:  Группы пользователей в Linux

$ cat Hello World $ sed 's/Hello/Hi/g' Hi World

Руководство по sed.

Команда интерпретатора Bash history

Выводит историю командной строки. Часто используется совместно с grep при поиске конкретной команды. В коде ниже будут найдены все команды, которые содержат строку g++:

$ history | grep g++ 155 g++ 159 g++

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

Команда интерпретатора Bash export

Устанавливает переменные окружения для их передачи дочерним процессам. Допустим, так мы можем передать переменную name, имеющую значение student:

$ export name=student

Команда интерпретатора Bash ps

Выводит данные о запущенных процессах.

Основные команды

$ ps PID TTY TIME CMD 35346 pts/2 00:00:00 bash

В результате выведутся 4 элемента: — PID (ID процесса), — TTY (тип терминала), — TIME (время работы процесса), — CMD (имя команды, запустившей процесс).

Команда интерпретатора Bash awk

Находит и меняет текст в файлах на основании заданного шаблона: awk ‘pattern {action}’

Команда интерпретатора Bash wget

Закачивает файлы из интернета, помещая их в текущий каталог.

$ wget -cs100

Команда интерпретатора Bash nc

Утилита для отладки сети. Вот руководство.

Команда интерпретатора Bash ping

Служит для тестирования сетевого подключения.

$ ping PING (74) 56(84) bytes of data. 64 bytes from (74): icmp_req=1 ttl=57 time=7.82 ms — ping statistics — 1 packets transmitted, 1 received, % packet loss, time 8ms rtt min/avg/max/mdev = 7.794/ ms

Статистика в конце отображает число подключений, которые были совершены до завершения команды. Также отображается время их выполнения.

Статья написана специально для курса по Linux на основании материалов Bash-Cheatsheet.

Инициализация ядра

Ядро — это основа любой системы Linux. Он связывает оборудование ПК с базовыми процессами. Ядро контролирует все процессы в вашей системе Linux. После того как выбранное ядро Linux загружено загрузчиком, оно должно самораспаковаться из сжатой версии перед выполнением любой задачи. После самораспаковывания выбранное ядро монтирует корневую файловую систему и инициализирует программу /sbin/init, обычно называемую init.

Инициализация ядра

Init всегда запускается первой программой, и ей назначается ID процесса или PID 1. Это процесс init, который порождает различных демонов и монтирует все разделы файловых систем, указанные в файле /etc/fstab.

Затем ядро монтирует начальный RAM-диск (initrd), который является временной корневой файловой системой, пока не будет смонтирована настоящая корневая файловая система. Все ядра находятся в каталоге /boot вместе с начальным образом RAM-диска.

Переменные и параметры скрипта

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

#!/bin/bash #указываем где у нас хранится bash-интерпретатор parametr1=$1 #присваиваем переменной parametr1 значение первого параметра скриптаscript_name=$0 #присваиваем переменной script_name значение имени скриптаecho "Вы запустили скрипт с именем $script_name и параметром $parametr1" # команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_ `Вы запустили скрипт с именем $script_name и параметром $parametr1` # здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки 0 #Выход с кодом 0 (удачное завершение работы скрипта)

Результат выполнения скрипта:

[email protected]:~$ ./ qwerty

Вы запустили скрипт с именем ./ и параметром qwertyВы запустили скрипт с именем $script_name и параметром $parametr1

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

$DIRSTACK — содержимое вершины стека каталогов$EDITOR — текстовый редактор по умолчанию$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как…$UID — реальный идентификатор, который устанавливается только при логине.$FUNCNAME — имя текущей функции в скрипте.$GROUPS — массив групп к которым принадлежит текущий пользователь$HOME — домашний каталог пользователя$HOSTNAME — ваш hostname$HOSTTYPE — архитектура машины.$LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов$OLDPWD — прежний рабочий каталог$OSTYPE — тип ОС$PATH — путь поиска программ$PPID — идентификатор родительского процесса$SECONDS — время работы скрипта(в сек.)$# — общее количество параметров переданных скрипту$* — все аргументы переданыне скрипту(выводятся в строку)[email protected] — тоже самое, что и предыдущий, но параметры выводятся в столбик$! — PID последнего запущенного в фоне процесса$$ — PID самого скрипта