Как открыть bash в linux
Перейти к содержимому

Как открыть bash в linux

  • автор:

Командная строка Linux: краткий курс для начинающих

Как работать с командной строкой и базовыми командами.

Введение

В данном руководстве мы вкратце ознакомимся с работой в командной строке в Ubuntu 20.04 .

Требования

  • Cервер с Ubuntu 20.04

Для разных операционных систем командную строку можно открывать с помощью приложений:

  • Mac OS X: Terminal (default), iTerm 2;
  • Windows: PuTTY;
  • Linux: Terminal, KDE Konsole, XTerm.

С подробным описанием команд для Ubuntu можно ознакомиться в официальной документации.

Вход на сервер через терминал

В операционной системе Ubuntu 20.04 открыть командную строку можно двумя способами: через консоль и через графический терминал.

Для работы через консоль следует нажать сочетание клавиш Ctrl+Alt+F1, для возврата в графический интерфейс — сочетание клавиш Ctrl+Alt+F7.

Для запуска терминала нажмите сочетание клавиш Ctrl+Alt+T.

Внизу экрана располагается приглашение командной строки — последовательность символов, извещающая о готовности к обработке команд:

kamilla@kamilla-Aspire-V3-371:~$

  • kamilla — имя текущего пользователя (суперпользователь/администратор);
  • kamilla-Aspire-V3-37 — имя хоста (сервер);
  • : — разделитель;
  • ~ — текущая директория (в какой папке выполняется команда) пользователя (по умолчанию /home/);
  • $ — символ приглашения ввода для пользователей с обычными правами;
  • # — символ приглашения ввода для суперпользователя/администратора root (например, root@cs49647:~#).

Базовые команды, используемые при настройке сервера

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

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

ssh -p №port demo@adress

  • №port — номер заданного порта при начальной настройке сервера;
  • demo — имя пользователя;
  • adress — ip-адрес сервера.

Для входа на сервер под учетной записью root используйте команду, заменив SERVER_IP_ADDRESS на публичный IP-адрес вашего сервера:

ssh root@SERVER_IP_ADDRESS

Для создания новой учетной записи пользователя введите команду, заменив имя DEMO на любое другое необходимое имя:

adduser DEMO

Для открытия конфигурационного файла в текстовом редакторе под пользователем root введите команду:

nano /etc/ssh/sshd_config

Для замены строчки в открывшемся конфигурационном файле найдите, например, строчку Port 22 и замените число 22 на любое другое число (от 1025 и до 65536).

После внесения изменений сохраните и закройте файл, нажав сочетание клавиш CTRL-X, затем клавишу Y, затем клавишу ENTER.

Для перезапуска сервиса SSH выполните следующую команду:

service ssh restart

Для выполнения команды с привилегиями root-пользователя, перед ней следует поставить слово sudo:

sudo command_to_run

Для завершения сессии выполните команду:

exit

Обзорное описание команд, аргументов и опций для них

Для запуска команды следует ввести команду и нажать клавишу Enter.

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

Для того чтобы открыть страницу с подробным описанием команды Linux, например ip address, введите команду man с именем команды:

man ip address

Запуск без аргументов и опций

При запуске команд без аргументов:

  • cd — возврат в домашнюю директорию текущего пользователя;
  • ls — вывод списка файлов и директорий в текущем каталоге.

Пример:

Выполнив команду ls без параметров, получаем список файлов в каталоге:

testk@cs49647:~$ ls
linux.jpg template ubuntu.jpg

Запуск с аргументами (параметрами)

Большинство команд рассчитано на запуск с передачей аргументов (параметров).

Наиболее распространенное использование команды cd — вызов с аргументом, который является путем к директории, в которую следует перейти:

cd /usr/bin

Запуск с опциями

Многие команды также поддерживают опции (флаги, ключи) запуска, позволяющие изменять результат выполнения команды. Опции представляют собой одиночный символ после символа «-», либо в расширенном написании после «—».

Пример:

Выполнив команду ls с опциями -A, -S, -1, получаем список всех файлов, включая «скрытые», расположенных по одному на каждой строке и отсортированных по размеру:

testk@cs49647:~$ ls -AS1
.gtkrc-2.0
linux.jpg
ubuntu.jpg
template
.filter

Запуск с аргументами и опциями (одновременно)

Структура записи команды с опциями и аргументами:

команда -опции аргументы

Пример:

Команда ls -la /home выведет подробный (-l) листинг директории /home, включая скрытые файлы (-a):

testk@cs49647:~$ ls -la /home
total 12
drwxr-xr-x 3 root root 4096 Oct 14 16:13 .
drwxr-xr-x 22 root root 4096 Oct 20 10:25 ..
drwxr-xr-x 4 testk testk 4096 Oct 19 10:52 testk

Переменные окружения

Окружение/среда (environment) — это набор пар ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ, которые могут использоваться запускаемыми процессами.

Просмотр переменных окружения

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

В зависимости от конфигурации системы, вывод списка переменных окружения может занять несколько экранов, поэтому лучше использовать команду:

env | more

Просмотр значения переменной

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

Чтобы вывести на экран значение какой-нибудь переменной окружения, достаточно набрать echo $ИМЯ_ПЕРЕМЕННОЙ, например, просмотр домашней директории пользователя, хранящийся в переменной окружения $HOME:

echo $HOME

Для перехода в домашнюю директорию следует использовать команду:

cd $HOME

Установка переменных окружения

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

VAR=value

VAR — название переменной;

value — значение переменной.

Пример:

Выполнив команду var=value, после вывода на просмотр получаем результат value:

testk@cs49647:~$ var=value testk@cs49647:~$ echo $var value

Заключение

Мы познакомились с принципами работы в командной строке и базовыми командами.

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

Зарегистрируйтесь в панели управления

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

Читайте также:

Инструкция

Как автоматизировать подготовку к собеседованиям с помощью Telegram-бота

29 сентября 2023

Инструкция

Как реализовать очередь в Redis

14 сентября 2023

Инструкция

Как генерировать истории с помощью ChatGPT и Telegram

Руководство по написанию скриптов в Linux Bash

Как писать программы на bash — руководство для новичка. Все о циклах, переменных, управляющих конструкциях и аргументах.

Введение

Набор встроенных команд bash (и его аналогов sh, zsh, etc) совместим с любым POSIX-совместимым приложением в Linux, что позволяет встроить в ваш bash-скрипт любое совместимое приложение. Это дает очень большой набор возможностей в сфере автоматизации рутинных задач администрирования систем Linux, деплоя и сборки приложений, различных пакетных обработок, в том числе аудио и видео.

Командная строка — самый мощный пользовательский интерфейс из существующих на данный момент. Базовый уровень знаний получить достаточно просто. Рекомендуется изучить руководство bash. Это можно сделать, выполнив команду man bash.

Суть bash-скриптов — записать все ваши действия в один файл и выполнять их по необходимости.

В этой статье расскажем про написание bash-скриптов с нуля и получим представление, какую пользу можно из них извлечь. Рекомендуем держать под рукой bash-справочник, если вы планируете заняться этим всерьез.

Развертывание среды

Для выполнения скриптов, которые мы будем учиться писать, нужна среда. Если вы используете на своем компьютере систему Linux, вы можете делать все локально. Если Windows, — можете установить WSL/WSL2. Кроме того, вы можете создать виртуальный сервер и подключиться к нему по SSH. Так вы не навредите своему компьютеру если что-то пойдет не так.

Мы выбрали вариант создать виртуальную машину. Залогинимся в личном кабинете https://my.selectel.ru/, нажав на вкладку «Облачная платформа». Там вы сможете создать виртуальный сервер.

Необходимо выбрать зону размещения сервера исходя из его близости к пользователям. Чем дальше сервер, тем выше пинг.

Нажмем «Создать сервер».

В разделе «Источник» убеждаемся, что выбран образ Ubuntu 20.04.

Конфигурацию можно настроить по своим потребностям.

В разделе «Сеть» стоит выбрать «Подсеть — Плавающий IP-адрес».

В разделе «Доступ» загрузите SSH-ключ и не забудьте сохранить root-пароль. Подробнее об этом рассказано в этой статье

Теперь можно создать сервер кнопкой «Создать» в самом низу.

Будет отображена страница статуса сервера, надо дождаться индикации ACTIVE вверху справа.

Теперь на вкладке «Порты» можно посмотреть IP-адрес, присвоенный серверу.

Не копируйте чужой код

Копирование чужого кода на свой компьютер/сервер опасно. Ранее существовал «патч Бармина», представляющий из себя команду rm -rf /*. Ее очень любили давать новичкам Linux на некоторых конференциях в качестве универсального средства от всех проблем. Суть команды — рекурсивное удаление всех каталогов внутри корневого каталога, т. е. всех системных и пользовательских файлов. Сейчас эта команда не сработает во всех актуальных версиях Linux, но раньше она служила злой шуткой и наказанием тем, кто копировал чужие скрипты на свои серверы и выполнял их. Способов навредить серверу/компьютеру все еще достаточно, но они не столь очевидны.

Выбор редактора

Вам потребуется удобный текстовый редактор. Если вы подключаетесь по SSH, то лучшим выбором будут 3 варианта:

  • * vim (если умеете из него выходить)
  • * nano (прост, удобен и надежен)
  • * mcedit (входит в пакет mc, классический двухпанельный консольный файловый менеджер)

Если вы делаете все локально, выбор полностью на вас. Обычный выбор под Linux — gedit. В этой инструкции мы пользовались nano через SSH на удаленном сервере.

Запуск “Hello, World!”

Первая программа, которую обычно пишут программисты это «Hello, World!» — простой вывод этой строки. Мы тоже с этого начнем. За вывод строки в консоль отвечает команда echo. Прямо в консоли вы можете напечатать echo «Hello, World!» и получить соответствующий вывод:

root@geneviev:~ # echo "Hello, World!" Hello, World! 

Сделаем это программой. Команда touch helloworld.sh создаст файл helloworld.sh. Команда nano helloworld.sh откроет этот файл для редактирования. Заполним файл нашей программой:

#!/bin/bash echo "Hello, World!" 

Для выхода с сохранением из nano надо нажать CTRL + O для сохранения (после чего нажать enter для перезаписи текущего открытого файла), а потом CTRL + X для выхода. Можно выходить без сохранения, при этом он спросит, точно ли вы хотите выйти без сохранения. Если да, надо нажать N для выхода без сохранения. Если вы нажмете Y, он спросит куда сохранить измененный файл, можно нажать enter для перезаписи редактируемого файла.

Разберем, что мы написали.

Первой строкой идет #!/bin/bash — фактически это указание на местоположение интерпретатора. Чтобы при запуске скрипта не требовалось указывать отдельно интерпретатор. Убедиться, что ваш bash интерпретатор лежит по этому пути можно через команду which bash:

root@geneviev:~ # which bash /usr/bin/bash 

Второй строкой идет непосредственно вся наша программа. Как она работает, мы разобрали выше, перейдем к выполнению.

Запустить ваш скрипт/команду можно двумя способами.

Способ №1: bash helloworld.sh. Вы вызываете интерпретатор и в аргументе передаете ему имя файла для исполнения.

root@geneviev:~ # bash helloworld.sh Hello, World! 

Способ №2: Сначала надо разрешить системе исполнять скрипт: chmod +x helloworld.sh. Эта команда сделает файл исполняемым. Теперь вы можете запустить его как любой бинарный файл в linux: ./helloworld.sh.

root@geneviev:~ # ./helloworld.sh Hello, World! 

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

Аргументы

Это параметры, которые вы можете передать программе при ее вызове. Например, программа ping принимает в качестве обязательного аргумента IP-адрес или DNS-имя, которое требуется пропинговать: ping selectel.ru. Это простой и удобный способ общения пользователя с программой.

Давайте научим нашу программу принимать аргументы и работать с ними. Доступ к аргументам осуществляется через служебную команду $X где X это число. $0 — всегда имя исполняемого скрипта. $1 — первый аргумент, $2 — второй и так далее. Конечно, если вы планируете передавать пару десятков аргументов вашему приложению, это может быть несколько утомительно, так что вам понадобится что-то вроде этого цикла, чтобы перебрать все поступившие аргументы:

for var in "$@"; do echo "$var" done 

Подробнее про циклы будет рассказано в следующих разделах.

Пример, создадим новый файл: touch hellousername.sh. Выдаем права на исполнение chmod +x hellousername.sh.

Открываем nano hellousername.sh

Код примера следующий:

#!/bin/bash echo "Hello, $1!" 

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

root@geneviev:~ # ./hellousername.sh Vasya Hello, Vasya! 

Программа получилась маленькая, но она учит пользоваться (на самом базовом уровне) аргументами, которые мы в нее можем передать. В данном случае аргумент передается один, Vasya, мы сразу его используем, не делая никаких проверок.

root@geneviev:~ # ./hellousername.sh Hello, ! 

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

Способ №1

#!/bin/bash if [ "$#" -lt 1 ]; then echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi echo "Hello, $1!" 

Более подробно конструкцию if then [else] fi мы рассмотрим далее, пока не будем на ней останавливаться. Важно понимать, что тут проверяется. $# Это число аргументов без учета имени скрипта, который всегда $0.

Способ №2

#!/bin/bash if [ -z "$1" ]; then echo "Имя пустое или не передано. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi echo "Hello, $1!" 

Здесь тоже используется конструкция if then [else] fi. Ключ -z в if используется для проверки переменной на пустую строку. Есть противоположный ключ -n, он проверяет что строка не пустая. Конечно, этот способ некорректно использовать для проверки входящих аргументов, но в теле самой программы он будет полезен. Например, чтобы проверить что выполненное в самой программе приложение что-то вернуло.

Управляющие конструкции

if-else

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

Возьмем один из примеров выше.

#!/bin/bash if [ "$#" -lt 1 ]; then echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi echo "Hello, $1!" 

Происходит проверка системной переменной $# на то, что она меньше, чем (lower than, -lt) 1. Если это выражение истинно, мы переходим в блок команд, открывающийся ключевым словом then. Весь блок, начинающийся с if, должен завершаться ключевым словом fi. Более сложная структура ветвления может выглядеть примерно так:

if TEST-COMMAND1 then STATEMENTS1 elif TEST-COMMAND2 then STATEMENTS2 else STATEMENTS3 fi 
#!/bin/bash if [ "$#" -lt 1 ]; then echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi if [ "$1" = "Vasya" ]; then echo "Whatsupp, Vasiliy?" elif [ "$1" = "Masha" ]; then echo "Hey, Masha" elif [ "$1" = "Michael" ]; then echo "Shalom, Michael" else echo "Hi, $1" fi 
root@geneviev:~ # ./hellousername.sh Vasya Whatsupp, Vasiliy? root@geneviev:~ # ./hellousername.sh Masha Hey, Masha root@geneviev:~ # ./hellousername.sh Michael Shalom, Michael root@geneviev:~ # ./hellousername.sh Andrew Hi, Andrew root@geneviev:~ # ./hellousername.sh Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: ./hellousername.sh Vasya 

Выражение «$1» = «Vasya» проверяет строки на идентичность. Блок после else выполняется только если выше не найден более подходящий блок.

&& и ||

В предыдущей главе вы могли заметить, что я использовал exit 1 для завершения работы программы в случае неуспешной проверки аргумента. Это означает, что программа завершилась с ошибкой. В bash есть операторы && и ||, которые используются для создания цепочек команд. Каждая цепочка зависит от результата выполнения предыдущей программы.

Пример 1: command1 && command2. В этом случае command2 выполнится, только если command1 завершится с кодом 0 (exit 0, по умолчанию).

Пример 2: command1 || command2. В этом случае command2 выполнится, только если command1 завершится с кодом отличным от 0.

Пример 3: command1 && command2 || command3. Если command1 завершится с кодом 0, то будет выполнен command2, иначе command3.

Переменные

Как гласит один из основных принципов программирования — Do Not Repeat Yourself (DRY). Вот и мы не будем повторять себя и перепишем предыдущий пример с использованием переменных, чтобы не вызывать echo каждый раз.

Переменные в bash создаются присваиванием: x=»foo bar» или z=$1. Переменной x мы присвоили строку @foo bar«, а переменной z мы присвоили значение первого аргумента. Использовать именованные переменные гораздо удобнее, чем использовать $1, особенно когда надо использовать его значение во многих местах.

К тому же, аргументы могут идти в разном порядке. Осмысленные названия переменных очень важны, при разрастании программы это снизит неизбежную путаницу. Избегайте имен переменных (и функций) вроде «a», «b», «zzzz», etc.

Чтобы не вызывать echo в каждом варианте с разными строками, разобьем строку на части. Первая часть будет приветствием. Вторая — именем. Третья — завершающим знаком препинания. Его можно не выносить в переменную.

#!/bin/bash greetString="Hello" nameString="stranger" if [ "$#" -lt 1 ]; then echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi if [ "$1" = "Vasya" ]; then nameString="Vasiliy" greetString="Whatsup" elif [ "$1" = "Masha" ]; then nameString="Maria" elif [ "$1" = "Michael" ]; then greetString="Shalom" nameString="Michael" fi echo "$greetString, $nameString!" 

В этом примере мы создаем переменные greetString и nameString, которым присваиваем значения по умолчанию. В конце программа выводит значения этих двух переменных с помощью echo и форматированной строки (в двойных кавычках переменные раскрываются). Между этими действиями программа определяет, надо ли присваивать переменным другие значения.

Switch case

Использование if-else конструкции в нашем примере не является оптимальным вариантом. Мы всего лишь сверяем значение переменной с определенным набором значений. В такой ситуации лучшим выбором будет switch-case-конструкция.

case "$variable" in "$condition1" ) command. ;; "$condition2" ) command. ;; esac 

Перепишем нашу программу приветствий с использованием switch-case:

#!/bin/bash name=$1 case "$name" in "Vasya" ) nameString="Vasiliy" greetString="Whatsup" ;; "Masha" ) greetString="Hey" nameString="Maria" ;; * ) greetString="Hello" nameString="stranger" ;; esac echo "$greetString, $nameString!" 

Циклы

Как и любой полноценный язык программирования, bash поддерживает циклы. Цикл for и цикл while. Циклы нужны, чтобы выполнять какой-то код заданное число раз. Например, при парсинге CSV перебирать построчно и каждую строку рассматривать отдельно.

Цикл for

Вот пример структуры цикла for:

for var in list do команды done 

Простой реальный пример:

#!/bin/bash for name in Maria Vasya Michael stranger do echo "Hello, $name!" done 
root@geneviev:~ # ./cycle.sh Hello, Maria! Hello, Vasya! Hello, Michael! Hello, stranger! 

Программа просто перебирает все имена, разделенные пробелом, и выводит их с помощью echo.

Попробуем немного усложнить пример:

#!/bin/bash file=$1 for name in $(cat $file) do echo "Hello, $name!" done 

Создадим файл с именами touch names и запишем в него список имен для приветствия:

Maria Vasiliy Ivan Nikolai Innokentiy 
root@geneviev:~ # ./cycle.sh ^C root@geneviev:~ # ./cycle.sh names Hello, Maria! Hello, Vasiliy! Hello, Ivan! Hello, Nikolai! Hello, Innokentiy! 

Обратите внимание на ^C. Это символ прерывания выполнения программы. В нашем случае мы вызвали программу без аргумента, и она вошла в вечный цикл. Можно сказать, зависла. Пришлось завершить ее принудительно. Не забывайте делать проверки входных данных в реальных программах. Как это делать, можете посмотреть в главах if-else и switch case, например.

В нашей программе есть небольшой баг. Модифицируем файл имен:

Erich Maria Remarque Vasiliy Ivan Nikolai Innokentiy 

Запустим программу, получим вывод:

root@geneviev:~ # ./cycle.sh names Hello, Erich! Hello, Maria! Hello, Remarque! Hello, Vasiliy! Hello, Ivan! Hello, Nikolai! Hello, Innokentiy! 

Как говорится, «Кто все эти люди?». Так получается, потому что у нас не задана переменная окружения IFS (Internal Field Separator), указывающая на разделители полей. Наш цикл использует пробелы и переносы строки как разделители. В начале скрипта (после #!/bin/bash) укажите использовать перенос строки как разделитель полей: IFS=$’\n’.

root@geneviev:~ # ./cycle.sh names Hello, Erich Maria Remarque! Hello, Vasiliy! Hello, Ivan! Hello, Nikolai! Hello, Innokentiy! 

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

Обычно цикл for используется со счетчиком. В C-like стиле. Что-то вроде for (i=0;i . В bash тоже так можно.

#!/bin/bash for (( i=1; i 

Цикл while

Схема организации цикла while:

while команда проверки условия do другие команды done 

Простой способ сделать бесконечную петлю (бесконечный цикл):

while true do echo "this is infinity loop" done 

Это может пригодится, например, когда вам нужно вызывать что-то чаще, чем позволяет cron (например, раз в минуту). Или когда вам просто надо проверять какое-то значение постоянно. Областей применения у бесконечных циклов много.

Здесь используются те же самые выражения, что и в if:

#!/bin/bash count=0 while [ $count -lt 10 ] do (( count++ )) echo "count: $count" done 
root@geneviev:~ # ./cycle.sh count: 1 count: 2 count: 3 count: 4 count: 5 count: 6 count: 7 count: 8 count: 9 count: 10 

Из цикла можно выйти с помощью команды break (работает также и для for):

#!/bin/bash count=0 while [ $count -lt 10 ] do (( count++ )) echo "count: $count" if [ "$count" -gt 5 ] then break fi done 
root@geneviev:~ # ./cycle.sh count: 1 count: 2 count: 3 count: 4 count: 5 count: 6 

Заключение

Несмотря на огромную конкуренцию в сфере автоматизации рутины со стороны python, ruby, perl bash не сдает позиции. Он прост в освоении и использовании, гибок и так или иначе присутствует в абсолютном большинстве дистрибутивов Linux.

В этой статье были приведены только основы написания программ на bash. Надеемся, вы нашли их полезными для себя.

Зарегистрируйтесь в панели управления

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

Читайте также:

Инструкция

Как автоматизировать подготовку к собеседованиям с помощью Telegram-бота

29 сентября 2023

Инструкция

Как реализовать очередь в Redis

14 сентября 2023

Инструкция

Как генерировать истории с помощью ChatGPT и Telegram

Bash – командная оболочка Linux

В большинстве дистрибутивов Linux по умолчанию установлена командная оболочка Bash. Отметим, что между всеми командными оболочками, соответствующими стандарту POSIX Unix-подобных операционных систем, разница небольшая.

Bash запускается в текстовом режиме или приложении "Терминал" и работает интерактивно. Это значит, что он ожидает ввод пользователя, далее интерпретирует введенную строку как команду, которую надо выполнить. Команды бывают разными: запуск программы, операции с файлами, выполнение скрипта на языке самого Bash и др.

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

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

Представьте, что подключаетесь по протоколу SSH к веб-серверу, на котором размещаете файлы сайта. Работая в ОС GNU/Linux и запустив программу "Терминал", вы даете Bash'у команду на подключение к удаленной машине под конкретным именем пользователя. Сервер отвечает вам и требует ввести пароль этого пользователя. Все потому, что пользоваться данным компьютером-сервером может далеко не один человек.

На локальном компьютере в текстовом режиме Linux (если вы нажмете, например, Ctrl + Alt + F2) эмулируется удаленный доступ к машине через терминал. Здесь Bash первым делом предлагает вам ввести логин, после чего – пароль. При вводе пароля на экране ничего не отображается. Так сделано специально, чтобы нельзя было подсмотреть даже количество вводимых символов. Если введенная пара логин/пароль соответствуют какому-либо ранее зарегистрированному в системе пользователю, то вы увидите приглашение командной строки Bash'а на ввод команды. В случае ошибки потребуется заново вводить логин/пароль.

В графическом режиме приложение "Терминал" автоматически "берет" данные запустившего его пользователя и передает Bash'у. Таким образом, вы уже оказываетесь представленными системе и первое, что видите, – приглашение командной строки.

Приглашение командной строки имеет относительно стандартный синтаксис и выглядит примерно так: имя_пользователя@имя_компьютра:текущий_каталог знак .

Приглашение Bash

На скриншоте pl – имя пользователя, comp – имя компьютера. Символ тильды ~ в Linux-системах – это сокращенное обозначение домашнего каталога пользователя ( /home/user ). Именно эту директорию Bash делает текущей по умолчанию. Знак доллара $ обозначает, что мы работаем под непривилегированным пользователем. Если находиться в системе под администратором, вместо доллара будет знак решетки # .

После приглашения автоматически ставится пробел и ожидается ввод команды. На рисунке выше сначала был просто нажат Enter . Во второй строке была введена команда перехода в другую директорию. В третьей строке мы видим результат ее выполнения – текущим каталогом стал /opt , что отображено в приглашении.

Существует множество команд, которые можно отдавать в Bash. В основном это команды запуска различных программ, которые находятся в каталогах /bin , /usr/bin и ряде других. Проверяемые каталоги записаны в переменной $PATH оболочки:

Вывод каталогов, содержащихся в переменной $PATH

Здесь с помощью команды echo мы просим Bash выдать нам значение переменной $PATH . В выводе каталоги отделены друг от друга с помощью двоеточия.

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

Запуск приложения из командной строки

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

Существуют программы с текстовым интерфейсом. Например, редактор Nano:

Консольный текстовый редактор Nano

В данном случае Bash'у была дана команда nano , и прямо в терминале был открыт редактор GNU Nano. В нем была введена пара слов. Чтобы завершить работу редактора, надо нажать Ctrl + X , подтвердить сохранение или отказаться от него. После этого произойдет возврат к командной строке Bash.

Многие из запускаемых в Bash программ не предполагают взаимодействие с пользователем в интерактивном режиме (в режиме диалога). По смыслу их правильнее называть командами, а не программами. Пользователь вводит команду, она выполняется и передает управление обратно Bash. Что делает команда, зависит от команды.

В Bash можно выполнять программы, находящиеся не только в каталогах, перечисленных в $PATH . Однако в этом случае адрес до них надо указывать явно. Кроме того, следует не забывать, что у файла должно быть право на исполнение.

Запуск скрипта на Python

Здесь в домашнем каталоге был создан файл test.py , содержащий код на языке программирования Python, выводящий на экран число 10. Код был написан в Nano (на скриншоте не показано). Далее мы пытаемся выполнить программу, обратившись к файлу по его адресу. Точкой обозначается текущий каталог. В данном случае он домашний, поэтому это равносильно ~/test.py или /home/pl/test.py .

При первом вызове мы получаем ошибку, так как у нас нет прав на исполнение программы. С помощью команды chmod мы добавляем такое право (параметр +x ).

Существует множество команд. Знать их все как минимум затруднительно. Однако есть ряд наиболее востребованных. Это команды для совершения операций над файлами, установки программ, просмотра директорий и файлов, перемещения по дереву каталогов, то есть всего того, что мы делаем в графическом режиме операционной системы. Многие из них будут рассмотрены в данном курсе. С некоторыми мы уже немного познакомились ( cd , ls , echo , chmod ).

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

Также не будем забывать, что Bash – это еще и скриптовый язык программирования. В файл, обычно с расширением .sh , может быть записан не только список команд, но также инструкции языка (условный оператор, циклы и др.), "говорящие" как и в каких случаях исполнять те или иные команды. Программирование в Bash в данном курсе не изучается.

Исследуйте самостоятельно, что делают следующие команды: date , cal , pwd , who , clear , exit . С помощью команды which выясните, в каких каталогах находятся исполняемые файлы этих программ.

Курс с ответами к заданиям и дополнительными уроками в PDF

X Скрыть Наверх

Введение в Linux и Bash. Курс

Сколько способов исполнить скрипт bash?

Сколько способов исполнить скрипт bash? главное изображение

Когда мы вызываем скрипт из терминала — то этот скрипт становится отдельным процессом, дочерним от процесса терминала. Он наследует все переменные среды, которые были объявлены через export $VAR (а не просто $VAR — простые не будут видны.) Когда этот дочерний скрипт изменяет унаследованную переменную — эта переменная уже его лично, в родительском процессе значение переменной не меняется. Надёжный способ передать из дочернего процесса в родительский какую-то инфу — это возвратить какие-то результаты, как из функции, или послать вывод дочерней функции в пайп.

bash ввёл такую тему: «встраивание» кода, прочитанного из другого файла прямо в текущий процесс. Файл не обязан быть исполняемым, а по правилам хорошего тона — его таким и не делают.

Примеры таких команд:

Это позволяет исполнить посторонний код, он обновляет переменные, а текущий процесс этим пользуется. Если бы посторонний код был запущен как дочерний — это не получилось бы. Если подключаемы скрипт захочет навредить — он навредит. Если в нём exit — то весь процесс закроется, не отработав до конца.

В подключаемом скрипте могут быть только переменные и функции — тогда переменные запишутся в текущее окружение, а функции будут доступны для вызова. Если и в текущем и в новом скрипте есть функции с одинаковым именем — нужно сперва текущую переназвать declare -f new_function_name=old_function_name , а потом делать вставку source side_bashcode .

Говорят, что ради возможности загрузить переменные из посторонних источников это и сделали. Ради того, чтоб у каждого пользователя был свой личный .profile (вызывается при логине) и .bashrc (вызывается при создании терминала). Это не синонимы. Окошко с терминалом можно закрыть, или открыть второе — .bashrc прочтётся заново. Даже без GUI — команда exec $SHELL делает то же самое, заставляет заменить текущий процесс командной оболочки на новый процесс, возможно даже на другое приложение. Оно запустится с нуля, как будто после логина. Но без самого логина, без перезагрузки .profile . Зато перезагрузится .bashrc.

Оригинальный, более старый и «совместимый со всеми» shell (sh), похоже, такого не умеет.

Запуск дочернего процесса

Это «обычный» запуск. Когда запускаем скрипт по имени, или приложение — то «родительская» (та, из которой исходит команда) прилога создаёт копию своего процесса, грузит в процесс код из запускаемого приложения, и «передаёт управление» = прекращает посылать команды, начинает с команды новой прилоги, которая описана как «точка входа». Примеры:

Чтобы вызвать так, нужно поставить разрешение «execute». Если это не машкод, а текст — в нём указать первой строкой #!/path/to/interpreter. Если хочешь вызывать его из любого каталога — добавь его в одну из папок $PATH, или папку с ним добавь в $PATH. Вуаля, системная команда, как у взрослых!

Дочка может унаследовать права от матери. Если найдёт себе материнский процесс, работающий под именем root, и тот позволит отпочковаться с теми же правами — вау, у процесса права на всё!

Какие ещё способы запуска?

#!/bin/bash SCRIPT_PATH="/path/to/script.sh" # Insert . "$SCRIPT_PATH" # Insert source "$SCRIPT_PATH" # Fork "$SCRIPT_PATH" # Fork bash "$SCRIPT_PATH" # ? eval '"$SCRIPT_PATH"' # ? OUTPUT=$("$SCRIPT_PATH") echo $OUTPUT # ? OUTPUT=`"$SCRIPT_PATH"` echo $OUTPUT # обратные кавычки тоже запускают скрипт! ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh` # ? ("$SCRIPT_PATH") # ? (exec "$SCRIPT_PATH") 

Вариант с двумя файлами:

& в конце — он позволит форкнуть процесс и тут же отключить его от терминала. Процесс работает сам по себе, а мы его не ждём, можем вводить новые команды или запускать параллельные процессы.

Внимейшн! Я узнал три варианта echo :

  • echo в sh — команда, которая не понимает опции -e (она её просто печатает как будто это целевой текст), но зато понимает, что \n (и другие эскейпы) нужно превращать в спецсимволы;
  • echo в bash — команда, которая без опции -e не превращает \n и другие эскейпы, ей нужно прямо заказать опцию -e — и тогда начнёт превращать;
  • echo в GNU utilites — вообще самостоятельная прилога, у неё тоже какие-то особенности.

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

Записать переменную в файл

 "$destfile" fi 
 "$destfile" 

printf работает как в C:

 "$destfile" 

Эти ответы не сработают, если текст:

  • начинается с -e, или с -n, или с -E
  • или содержит \n
  • не должен заканчиваться переводом строки, когда будет записан в файл.

Что тогда поможет?

 "$destfile" printenv var > "$destfile" 

printenv [name] -- print out the environment [or just only name value if specified] env [-] [-i] [name=value . ] [utility [argument . ]] -- set and print environment

Я видел одно упоминание этой команды, а команда есть!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *