Расширение shell файлов linux

Самоучитель по написанию скриптов Bash для начинающих. Часть 1

Выпускаем серию статей о том, как писать скрипты Bash. Подойдет начинающим!

Что такое Bash/Shell/Scripting

Bash — это интерпретатор командного языка. Он широко доступен в различных операционных системах и является командным интерпретатором по умолчанию в большинстве систем GNU/Linux. Название является акронимом для ‘Bourne-Again SHell’.

Shell — это макропроцессор, который позволяет выполнять команды в интерактивном или неинтерактивном режиме.

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

Основы сценариев оболочки Bash

Не отчаивайтесь, если вы не поняли ни одного из приведенных выше определений. Это совершенно нормально, ведь именно поэтому вы читаете эту статью.

Если вы не знали, Bash Scripting является обязательным навыком для любой работы в Linux системного администрирования, даже если работодатель может не требовать этого в явном виде.

Что такое Shell

Скорее всего, в данный момент вы сидите за компьютером, открыли окно терминала и задаетесь вопросом: «Что же мне делать с этой штукой?».

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

Попробуйте это прямо сейчас! Используйте клавиатуру и введите несколько команд, таких как date, cal, pwd или ls, после чего нажмите клавишу ENTER.

Вы только что сделали то, что с помощью команд и командной оболочки взаимодействовали с компьютером, чтобы получить текущую дату и время (date), просмотреть календарь (cal), проверить расположение текущего рабочего каталога (pwd) и получить список всех файлов и каталогов, расположенных в нем (ls).

*у нас в папке пока ничего нет, поэтому команда ls не дала вывода.

Что такое скриптинг (сценарии Bash)

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

Чтобы понять, что подразумевается под сценариями, используйте shell в сочетании с вашим любимым текстовым редактором, например vi, чтобы создать новый файл task.sh, содержащий все вышеперечисленные команды, каждую в отдельной строке. После этого сделайте новый файл исполняемым с помощью команды chmod с опцией +x. И наконец, запустите новый скрипт, добавив к его имени ./.

Как видите, с помощью сценариев можно автоматизировать любое взаимодействие с оболочкой. Более того, теперь можно автоматически выполнять наш новый сценарий task.sh ежедневно в любое заданное время с помощью планировщика заданий cron и сохранять вывод сценария в файл при каждом его выполнении. Однако это уже другая история, а пока давайте сосредоточимся на предстоящей задаче.

Что такое Bash

До сих пор мы рассматривали shell и сценарии. А что насчет Bash? Где находится bash? Как уже упоминалось, bash является интерпретатором по умолчанию во многих системах GNU/Linux, поэтому мы использовали его, даже не осознавая этого. Вот почему наш предыдущий сценарий оболочки работает даже без определения bash в качестве интерпретатора. Чтобы узнать, какой у вас интерпретатор по умолчанию, выполните команду echo $SHELL:

Читайте также:  Что такое пароль root windows

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

Чтобы определить интерпретатор вашего скрипта как Bash, сначала найдите полный путь к его исполняемому двоичному файлу с помощью команды which, добавьте к нему префикс shebang #! и вставьте его в качестве первой строки вашего скрипта. Существуют и другие способы определения интерпретатора командной оболочки, но это — надежное начало.

С этого момента все наши сценарии будут включать определение интерпретатора оболочки #!/bin/bash.

Имена файлов и разрешения

Далее давайте кратко обсудим права доступа к файлам и имена файлов. Вы, наверное, уже заметили, что для выполнения сценария shell файл должен быть сделан исполняемым с помощью команды chmod +x FILENAME. По умолчанию все вновь созданные файлы не являются исполняемыми, независимо от суффикса расширения файла.

На самом деле, расширение файла в системах GNU/Linux не имеет никакого значения, кроме того, что при выполнении команды ls для перечисления всех файлов и каталогов сразу становится ясно, что файл с расширением .sh — это, скорее всего, сценарий оболочки, а файл с .jpg — сжатое с потерями изображение.

В системах GNU/Linux команда file может быть использована для определения типа файла. Как видно из приведенного ниже примера, расширение файла не имеет никакого значения, а интерпретатор оболочки, в данном случае, имеет больший вес.

Таким образом, имя shell-сценария 0_xyz вполне допустимо, но по возможности его следует избегать.

Выполнение скриптов Bash

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

Другим способом выполнения сценариев bash является явный вызов интерпретатора bash, например, $ bash date.sh , что позволяет выполнить сценарий без необходимости делать сценарий оболочки исполняемым и без объявления shebang непосредственно в сценарии оболочки. При явном вызове исполняемого двоичного файла bash содержимое нашего файла date.sh загружается и интерпретируется как сценарий оболочки Bash.

Относительный и абсолютный путь

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

Наверное, лучшая аналогия для объяснения относительного и абсолютного пути к файлу — это представить файловую систему GNU/Linux как многоэтажное здание. Корневой каталог (входная дверь здания), обозначенный /, обеспечивает вход во всю файловую систему (здание), а значит, дает доступ ко всем каталогам (уровням/комнатам) и файлам (людям).

Чтобы перейти в комнату 1 на уровне 3, нам сначала нужно войти в главную дверь /, затем пройти на уровень 3 level3/ и оттуда войти в комнату 1. Следовательно, абсолютный путь к этой конкретной комнате в здании — /level3/room1. Отсюда, если мы хотим посетить комнату2 на уровне 3, нам сначала нужно покинуть наше текущее местоположение — комнату1, введя ../, а затем включить название комнаты room2. Мы взяли относительный путь к room2, который в данном случае будет ../room2. Мы уже находились на уровне 3, поэтому не было необходимости покидать все здание и идти по абсолютному пути через главный вход /level3/room2.

К счастью, в GNU/Linux есть простой инструмент компас, который поможет вам ориентироваться в файловой системе в виде команды pwd. Эта команда при выполнении всегда выводит ваше текущее местоположение. В следующем примере используются команды cd и pwd для навигации по файловой системе GNU/Linux с использованием абсолютных и относительных путей.

Читайте также:  Windows 10 время перезагрузки компьютера

Быстрый совет:

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

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

Источник

Что такое bash / shell

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Windows 10 загрузиться без пароля

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

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

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

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

Когда надо выполнить больше 3 команд за раз — проще выполнить одну, запустить скрипт.

Когда одну и ту же команду надо выполнять чаще 3 раз — лучше автоматизировать эту работу.

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

См также по bash:

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

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

Источник

Расширение shell файлов linux

Новые пользователи Linux часто задают вопросы: Как запустить исполняемый файл в Linux? Как выполнить файл. sh в Linux?

Bash — это оболочка, или интерпретатор командного языка, для операционной системы Linux. Это название является аббревиатурой от Bourne-Again SHell.

Как же запустить shell скрипт в Linux?

Откроем терминал. Обычно он вызывается комбинацией клавиш Ctrl+Shift+T. Используйте консольный текстовый редактор вроде vi/vim или nano чтобы создать shell скрипт в линукс:

Сделайте скрипт исполняемым

$ chmod +x myscript.sh

Запустите shell скрипт, написал в терминале:

Теперь давайте рассмотрим другой пример создания sh скрипта в Linux.

Создадим новый файл скрипта test.sh:

Нажмем i или Insert на клавиатуре, чтобы перейти в режим вставки текста. Скопируем туда или напишем следующее:

!/bin/bash
echo «Hello, $USER»
echo «Today is $(date)»
echo «Bye»

Чтобы сохранить файл, нажмем ESC, затем напишем 😡 и нажмем ENTER.

Попробуем запустить скрипт:

bash: ./test.sh: Permission denied

Ошибка появилась потому что мы не сделали файл исполняемым. Сделаем это. Как и выше, чтобы сделать файл sh в линукс исполняемым, выполним команду:

Запустим его снова:

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

Что у нас есть в скрипте test.sh?

Первая строка #!/bin/bash указывает на интерпретатор, спомощью которого будет исполняться скрипт. В нашем случае это Bash.

Вторая строка использует глобальную переменную $USER, которая содержит имя текущего пользователя, от которого исполняется скрипт. Мы получим «Hello, user», если нашего пользователя зовут user.

В третьей строке мы используем переменную, содержащую текущую дату и время — $(date).

Источник

Оцените статью