Написание функций Bash
Сначала нужно понять что такое функция в нашем контексте. Функция — это набор команд, объединенных одним именем, которые выполняют определенную задачу. Функция вызывается по ее имени, может принимать параметры и возвращать результат работы. Одним словом, функции Bash работают так же, как и в других языках программирования.
Синтаксис создания функции очень прост:
имя_функции() { список_команд }
Имя функции не должно совпадать ни с одной из существующих команд или функций, а все команды в теле функции пишутся с новой строки.
Простая функция
Давайте напишем небольшую функцию, которая будет выводить строку на экран:
$ vi function.sh
#!/bin/bash
printstr(){
echo «hello world»
}
printstr
Вызов функции bash выполняется указанием ее имени, как для любой другой команды. Запустите наш скрипт на выполнение, не забывайте, что перед этим нужно дать ему права на выполнение:
Все работает, теперь усложним задачу, попробуем передать функции аргументы.
Аргументы функции
Аргументы функции нужно передавать при вызове, а читаются они точно так же, как и аргументы скрипта. Синтаксис вызова функции с параметрами bash такой:
имя_функции аргумент1 аргумент2 … аргументN
Как видите, все достаточно просто. Параметры разделяются пробелом. Теперь улучшим нашу функцию, чтобы она выводила заданную нами строку:
Можно сделать, чтобы параметров было несколько:
Есть и другой способ извлекать аргументы, как в Си, с помощью стека. Мы извлекаем первый аргумент, затем сдвигаем указатель стека аргументов на единицу и снова извлекаем первый аргумент. И так далее:
Возврат результата функции
Вы можете не только использовать функции с параметрами bash, но и получить от нее результат работы. Для этого используется команда return. Она завершает функцию и возвращает числовое значение кода возврата. Он может быть от 0 до 255:
Если вам нужно применить возврат значения функции bash, а не статус код, используйте echo. Строка не сразу выводится в терминал, а возвращается в качестве результата функции и ее можно записать в переменную, а затем использовать:
Экспорт функций
Вы можете сделать функцию доступной вне скрипта с помощью команды declare:
Затем запустите скрипт с помощью команды source:
Рекурсия
Вы можете вызвать функцию из нее же самой, чтобы сделать рекурсию:
Вы можете поэкспериментировать с использованием рекурсии, во многих случаях это может быть полезным, только не забывайте делать первый вызов функции Bash.
Локальные переменные в функции
Если вы объявите обычную переменную в функции, то она будет доступной во всем скрипте, это удобно для возврата значения функции, но иногда может понадобиться сделать локальную переменную. Для этого существует команда local:
Библиотеки функций
Мы можем взять некоторые функции bash и объединить их в одну библиотеку, чтобы иметь возможность одной командой импортировать эти функции. Это делается похожим образом на экспорт функций. Сначала создадим файл библиотеки:
test1(){
echo «Hello World from 1»;
}
test2(){
echo «Hello World from 2»;
}
test3(){
echo «Hello World from 3»;
}
Теперь создадим скрипт, который будет использовать наши функции. Импортировать библиотеку можно с помощью команды source или просто указав имя скрипта:
Навигация по файловой системе
При навигации по файловой системе в Linux можно использовать как абсолютный, так и относительный пути к ресурсу.
Абсолютный (или полный) путь начинается с корневого каталога, обозначаемого символом , а относительный путь начинается с текущего каталога (в котором в данный момент работает пользователь).
Команда pwd
Команда pwd (от англ. «present working directory») позволяет узнать, в каком каталоге вы находитесь в данный момент:
Результатом будет путь к текущему рабочему каталогу:
Команда cd
Команда cd (от англ. «change directory») используется для смены текущего рабочего каталога. При использовании без каких-либо параметров, команда перенесет вас в ваш домашний каталог:
Чтобы перейти в другой каталог, вы можете использовать абсолютный или относительный путь. Например, перейти в папку Downloads, расположенную в текущем каталоге, можно как через относительный путь:
Так и через абсолютный путь:
Две точки обозначают родительский каталог или каталог уровнем выше текущего. Предположим, что в данный момент вы находитесь в каталоге usr/local/bin. Чтобы перейти в каталог usr/local (на один уровень выше текущего каталога), необходимо ввести:
Чтобы подняться на два уровня вверх:
Чтобы вернуться к предыдущему рабочему каталогу, используйте символ тире в качестве опции:
Если каталог, который вы хотите изменить, имеет пробелы в своем имени, то вы должны либо взять путь в кавычки, либо использовать символ обратной косой черты :
Параметры скриптов
Для того, чтобы обеспечить некоторую универсальность, существует возможность при вызове передавать скрипту параметры. В этом случае вызов скрипта будет выглядеть так: , например .
Для того, чтобы получить значение первого параметра, необходимо в скрипте указать , второго — , и т.д. Существует также ряд других переменных, значения которых можно использовать в скрипте: – имя скрипта – количество переданных параметров – PID(идентификатор) процесса, выполняющего скрипт – код завершения предыдущей команды
Создадим файл script1.sh следующего содержания:
Выдадим права на выполнение и выполним скрипт с параметрами:
Мы передали 2 параметра, указывающие город и страну, и использовали их в скрипте, чтобы сформировать строку, выводимую командой printf. Также для вывода в строке Hello использовали имя пользователя из переменной USER.
Для того, чтобы передать значения параметров, состоящие из нескольких слов (содержащие пробелы), нужно заключить их в кавычки:
При этом нужно доработать скрипт, чтобы в команду printf параметры также передавались в кавычках:
Из приведенных примеров видно, что при обращении к переменной для получения её значения используется символ $. Для того, чтобы сохранить значение переменной просто указывается её имя:
Копирование, перемещение и удаление
Как правило, функции копирования, перемещения и удаления выполняют через файловый менеджер, но можно делать это и через терминал.
rmdir movies # удалить пустой каталог moviesrm -rf movies # удалить каталог movies и его файлыrm file1.txt # удалить файл file1.txtmv /home/michael/myfile.txt /home/john/important.txt # переместить файл из /home/michael в /home/johncp /home/michael/myfile.txt /home/john/important.txt # скопировать файл из /home/michael в /home/johncp -R letters/ memories/ # скопировать содержимое папки "letters" в папку "memories"cp -R letters ~/Desktop # скопировать папку "letters" вставить на рабочий стол
Ls
обозначаети он перечисляет содержимое каталога.обычно начинается с просмотра нашего домашнего каталога. Это означает, что если мы печатаемсамо по себе оно всегда будет печатать содержимое текущего каталога, который в моем случае
Мой домашний каталог представлен в оболочке и графическом интерфейсе.
параметры
Параметры и параметры включают некоторые специальные функции при использовании скоманда.
- : чтобы увидеть содержимое определенной папки.
- Для перечисления всех скрытых файлов в папке
- Распечатывает более длинный и подробный список файлов.также может использоваться с именем каталога, чтобы вывести список файлов этого конкретного каталога.
- Тильда (~) — это сокращение, обозначающее домашний каталог. Таким образом, независимо от того, в какой каталог мы находимся,всегда будет перечислять домашний каталог.
Просмотр директорий
Чтобы перейти в директорию с логами достаточно ввести команду cd и её абсолютный адрес.
Например:
cd /glassfish_domains/server_name/logs
Если абсолютный адрес директории неизвестен, нужно перемещаться куда-то из текущей директории.
Узнать содержимое текущей директории можно с помощью команды
ls
Например
ls -la
где опция l требует вывода в так называемом длинном формате.
Вывод будет содержать
права доступа, количество жёстких ссылок на файл , владельца, группу, размер,
время последнего изменения и называние файла.
a — это опция которая требует показать скрытые файлы — те, называние которых начинается с .
Переместиться в директорию на уровень ниже можно с помощью команды cd название директории
cd testProject01
Подняться на уровень выше
cd ..
Создание директории
Для того, чтобы создать директорию выполните команду:
mkdir название_директории
где название_директории — это та директорию, который вы хотите создать.
К примеру, создадим директорию test_Project2:
mkdir test_Project2
Копирование директории
Для того, чтобы скопировать директорию из одного места в другое, выполните команду:
cp -a project01 project02
где project01 — источник (директорию, которую вы хотите скопировать)
а project02 — получатель (тот директорию, в которую вы хотите скопировать)
ключ -a означает то, что мы выполняем нерекурсивное копирование.
Например, скопируем директорию /usr/local/project01 в своу домашнюю директорию и назовем её project01arj:
cp -a /usr/local/project01 ~/project01arj
Перемещение / Переименование директории
За перемещение и переименование директорий, в Linux отвечает команда mv.
Рассмотрим примеры:
перемещение директории /usr/local/projects в уже существующую, в домашней директории, директорию project01arj:
mv /usr/local/statistics ~/project01arj/
переименование директории /usr/local/projects в /usr/local/testedProjects:
mv /usr/local/statistics /usr/local/newstatistics
Удаление директории
Удаление директории и её содержимого, можно произвести при помощи команд rmdir или rm:
удаляем директорию /usr/local/testedProjects/temp:
rmdir /usr/local/testedProjects/temp
или рекурсивно директорию /usr/local/testedProjects/temp, со всеми директориями внутри него:
rm -rf /usr/local/testedProjects/temp
Двойные скобки
Результат выполнения команды можно легко сохранить в переменную.
На основе этого механизма можно выполнять арифметические действия. Достаточно вместо одной пары скобок использовать две.
Рассмотрим примеры в скрипте
expansion_example.sh
Разберём этот скрипт:
Строка 4 — Базовый синтаксис. Можно ставить пробелы без использования кавычек.
Строка 7 — Работает и без пробелов.
Строка 10 — Можно использовать переменные без $ перед ними.
Строка 13 — А можно и с $
Строка 16 — Увеличение переменной на 1. Символ $ не нужен.
Строка 19 — Увеличение переменной на 3. Это краткая форма записи b = b + 3.
Строка 19 — В отличие от других способов символ * не нужно экранировать.
./expansion_example.sh
981112131620
Двойные скобки дают довольно много свободы в форматировании кода.
Они доступны в Bash по умолчанию и их эффективность немного выше. Хотя заметить разницу на современных компьютерах будет непросто.
Команды в bash
Команда в bash — это наименьшая единица кода, которую bash может выполнить. С помощью команд мы сообщаем шеллу, что нам нужно, чтобы он сделал. bash обычно принимает от пользователя одну команду и возвращается к нему после того, как команда будет выполнена. Чтобы немного освоиться в bash, давайте попробуем выполнить несколько простых команд.
Команда echo — возвращает всё, что вы вводите в командной строке:
Пример использования команды echo
Команда date — отображает текущее время и дату:
Пример использования команды date
Команда pwd (сокр. от print working directory») — указывает на текущий рабочий каталог, в котором команды шелла будут искать файлы.
Файловая иерархия в Linux имеет древовидную структуру, поэтому, чтобы добраться до указанного каталога или файла, нам нужно пройти определенный путь, каждый узел которого отделен от других узлов символом .
Пример использования команды pwd
Команда ls (сокр. от list») — отображает содержимое каталога. Обычно, команда начинает с просмотра нашего домашнего каталога. Это означает, что если мы просто напечатаем , то данная команда выведет содержимое текущего каталога, которым в нашем примере является домашний каталог /home/diego:
Пример использования команды ls
Команда cd (сокр. от change directory») — изменяет текущую директорию на заданную пользователем. Рассмотрим некоторые примеры использования данной команды:
— меняет текущую директорию на заданную. Давайте попробуем с помощью команды перейти к корневому каталогу и ознакомимся с его содержимым
Обратите внимание, что мы также можем использовать точку с запятой для записи двух команд в одной строке
Пример объединения двух команд в одной строке
— вернуться в родительский каталог.
— вернуться в домашний каталог.
Команда mkdir (сокр. от make directory») — создает новый каталог.
Команда mv (сокр. от move») — перемещает один или несколько файлов/каталогов из одного места в другое (заданное пользователем). Для этого нужно указать, что мы хотим переместить (т.е. источник), и куда мы хотим переместить (т.е. пункт назначения).
В качестве примера я создам новый каталог Ravesli в своей домашней директории и перемещу в него все .txt-файлы (ну как «все», у меня там только один файл — Адреса.txt) из home/diego/Документы/ с помощью двух вышеприведенных команд:
Перемещение файлов с помощью команды mv
Команда touch — создает новые пустые файлы (а также изменяет временные метки в существующих файлах и каталогах). Вот как мы можем создать пустой файл под названием foo.txt в папке Ravesli из домашнего каталога:
Создание файла с помощью команды touch
Команда rm (сокр. от remove») — удаляет файлы/каталоги. По умолчанию, команда НЕ удаляет каталоги, но если используется как внутри заданного каталога, то каждый подкаталог и файл внутри заданного каталога — удаляются.
Давайте удалим ранее созданный файл foo.txt:
Удаление файла с помощью команды rm
Команда rmdir (сокр. от remove directory») — удаляет каталоги.
Давайте удалим созданный ранее каталог home/diego/Ravesli:
Удаление каталогов с помощью команды rmdir
Команда cat (сокр. от «concatenate») — считывает файл и выводит его содержимое. Она может работать с несколькими файлами, объединяя их вывод в единый поток (отсюда и происходит её название). У меня в домашнем каталоге есть папка untitled с файлами С++/Qt-проекта, и ниже я использую команду для просмотра содержимого файла main.cpp из untitled:
Пример использования команды cat
Чтобы просмотреть несколько файлов, укажите друг за другом (через пробел) имена требуемых файлов после команды , например:
Просмотр нескольких файлов с помощью команды cat
Команда man (сокр. от «manual») — отображает справочные страницы, которые являются руководством пользователя, встроенным по умолчанию во многие дистрибутивы Linux и большинство систем Unix. Например, команда отобразит руководство пользователя, а команда отобразит справку по команде .
Отображение справочной информации с помощью команды man
expr
expr похож на let за исключением того, что вместо сохранения результата в переменную expr по умолчанию печатает ответ.
Но никто не запрещает сохранять результат expr в переменные с помощью command substitution: x = $(expr 2 + 2)
В отличие от let не нужно заключать выражения с пробелами в кавычки
Нужно ставить пробелы вокруг операторов.
Рассмотрим простой пример:
expr_example.sh
Разберём этот пример пошагово:
Строка 4 — Это базовый синтаксис
Обратите внимание на пробелы и на отсутствие кавычек.
Строка 6 — Если заключить выражение в кавычки его в таком виде и выведет в терминал.
Строка 8 — Если не поставить пробелы выражение будет выведено в терминал без вычисления.
Строка 10 — Некоторые символы нужно экранировать.
Строка 12 — Это деление по модулю. Результатом будет остаток от целочисленного деления двух чисел.
Строка 14 — Пример выполнения command substitution чтобы сохранить результат в переменную a
./expr_example.sh 12
9
5 + 4
5+4
60
1
7
Основы скриптов
Скрипт или как его еще называют — сценарий, это последовательность команд, которые по очереди считывает и выполняет программа-интерпретатор, в нашем случае это программа командной строки — bash.
Скрипт — это обычный текстовый файл, в котором перечислены обычные команды, которые мы привыкли вводить вручную, а также указанна программа, которая будет их выполнять. Загрузчик, который будет выполнять скрипт не умеет работать с переменными окружения, поэтому ему нужно передать точный путь к программе, которую нужно запустить. А дальше он уже передаст ваш скрипт этой программе и начнется выполнение.
Простейший пример скрипта для командной оболочки Bash:
Утилита echo выводит строку, переданную ей в параметре на экран. Первая строка особая, она задает программу, которая будет выполнять команды. Вообще говоря, мы можем создать скрипт на любом другом языке программирования и указать нужный интерпретатор, например, на python:
Или на PHP:
В первом случае мы прямо указали на программу, которая будет выполнять команды, в двух следующих мы не знаем точный адрес программы, поэтому просим утилиту env найти ее по имени и запустить. Такой подход используется во многих скриптах. Но это еще не все. В системе Linux, чтобы система могла выполнить скрипт, нужно установить на файл с ним флаг исполняемый.
Этот флаг ничего не меняет в самом файле, только говорит системе, что это не просто текстовый файл, а программа и ее нужно выполнять, открыть файл, узнать интерпретатор и выполнить. Если интерпретатор не указан, будет по умолчанию использоваться интерпретатор пользователя. Но поскольку не все используют bash, нужно указывать это явно.
Чтобы сделать файл исполняемым в linux выполните:
Теперь выполняем нашу небольшую первую программу:
Все работает. Вы уже знаете как написать маленький скрипт, скажем для обновления. Как видите, скрипты содержат те же команды, что и выполняются в терминале, их писать очень просто. Но теперь мы немного усложним задачу. Поскольку скрипт, это программа, ему нужно самому принимать некоторые решения, хранить результаты выполнения команд и выполнять циклы. Все это позволяет делать оболочка Bash. Правда, тут все намного сложнее. Начнем с простого.
Let
let это встроенная функция bash, которая позволяет производить базовые арифметические операции.
Используется следующим образом:
Рассмотрим примеры в скрипте
let_example.sh
Разберём команды по очереди:
Строка 4 — Это простейшая форма записи без кавычек.
Помните, что если вычисление идёт без кавычек — ставить пробелы нельзя
Строка 7 — Если поставить кавычки — можно пользоваться пробелом для лучшей читаемости.\
Строка 10 — Увеличиваем значение на 1. Это аналог «a = a + 1».
Строка 16 — В выражение можно включить и другие переменные.
./let_example.sh 11
99102041
Таблица основных операторов
Оператор | Операция |
---|---|
+, -, \*, / | Сложение, вычитание, умножение, деление |
var++ | Увеличение переменной на 1 |
var— | Уменьшение переменной на 1 |
% | Модуль: возвращает остаток от деления |
Список установленных оболочек
Чтобы увидеть, какие оболочки установлены на вашем компьютере, используйте эту команду. Он просто перечисляет содержимое файл:
cat /etc/shells
Мы упоминали , , а также , но что ?
это Томпсон оболочка, написанная еще в 1971 году Кен Томпсон из Bell Labs известность. Он больше не поддерживается и давно заменен современными оболочками. Он включен исключительно для обеспечения совместимости со старыми сценариями, в которых в первой строке по-прежнему указывается следующее:
#!/bin/sh
Это инструктирует систему использовать оболочка для выполнения скрипта. У вас действительно есть эта древняя оболочка на вашем компьютере, и она используется для запуска ваших скриптов? Команда скажет нам, какая программа действительно запускается при вводе команды.
Давайте посмотрим, что работает, когда вы печатаете :
which sh
Это кажется, чтобы найти двоичный файл. если мы копнем немного глубже, мы увидим, что это символическая ссылка, которая на самом деле указывает на облегченная оболочка, используемая для выполнения скриптов:
ls -l /bin/sh
Это аккуратный и легкий способ обеспечения безопасности для сценариев, которые ожидают найти на современных системах.
Почему Shell важна
Оболочка сидит между вами и операционной системой. Он обеспечивает среду внутри окна терминала, которая позволяет вводить команды и запускать программы. Оболочка проверяет ваш ввод и выясняет, что вы хотите. Если он может выполнять ваши ставки самостоятельно, он делает это. Если ему нужна помощь извне, он ищет путь и находит программы, которые могут делать все, что вам нужно.
В Linux доступно много различных оболочек. Все они позволяют выполнять одни и те же основные задачи: исследовать файловую систему, работать с файлами, запускать программы и запускать сценарии. Однако каждый из них выполняет эти задачи по-своему, и у них есть свои особенности и особенности.
Оболочки, как правило, разрабатываются людьми, которые хотят, чтобы вещи вели себя определенным образом. Если ваше мышление совпадает с мышлением этого дизайнера, эта оболочка вполне подойдет вам. Плюс, пробовать новую оболочку в Linux легко.
В большинстве дистрибутивов Linux, включая Ubuntu, оболочка по умолчанию , Это делает большую работу и очень способный. Тем не менее, другая оболочка может сэкономить время, что окажет большое влияние на ваш рабочий процесс. Вы никогда не узнаете, не посмотрите ли вы!
СВЯЗАННЫЕ С: Что такое ZSH, и почему вы должны использовать его вместо Bash?
Зачем вообще пользоваться терминалом
Может показаться, что писать команды вручную не так удобно, как пользоваться графическим интерфейсом. Однако есть много ситуаций, когда терминал ускоряет процесс.
Например, в графической программе вы вынуждены использовать те возможности, которые предоставляют разработчики. Терминал же позволяет самостоятельно создавать скрипты, которые заточены под ваши нужды.
Если вы пишете код, то чаще всего вообще не отрываете руки от клавиатуры. Если будете пользоваться графическим интерфейсом, то вам придётся тянуться до мыши, наводить курсор и выполнять другие манипуляции — всё это отнимает время.
Системным администраторам нужен Bash, потому что большинство серверов работают без мониторов и на многих в принципе не установлена оболочка рабочего стола. Тогда удобнее всего подключиться к серверу через SSH и управлять им с помощью команд в терминале. Это делается и для экономии ресурсов.
Пользователь и система
Используя bash, вы можете легко получить любую необходимую вам техническую информацию о пользователях и системе.
Если вы хотите идентифицировать, под каким пользователем авторизованы в данный момент, вам нужно ввести в командную строку следующую команду:
whoami
Если вам нужно узнать не только о вашем, но и о других пользователях, находящихся в данный момент в этой операционной системе, используйте команды:
who
или
w
В отличие от whoami, эти команды показывает более подробную информацию: кроме имени пользователя вы также узнаете о том, какая используется терминальная линия, время начала сеанса, IP-адрес и некоторые другие данные.
Что касается данных о системе, то с ними можно ознакомиться, используя команду uname. Сама по себе эта команда даст вам не так много информации – только название системы. Однако если вы будете использовать ключи, то сможете узнать гораздо больше.
Ключи – это специальные аргументы, которые пишутся через пробел после команды и начинаются с одного или двух дефисов. Они определяют параметры, которые будут применены к команде. Как правило, узнать о доступных ключах вы можете, написав команду и —help (либо -help): к примеру,
uname --help
У команды uname вы можете задать ключ -a (или —all), и тогда на экран будет выведена вся информация об операционной системе:
uname -a
Если вас интересуют конкретно данные о ядре, то наберите следующую команду:
uname -rv
В этом случае вы узнаете о релизе и версии ядра операционной системы.
Получить информацию обо всех процессах можно при помощи этой команды:
ps -a
А команда pstree выведет информацию в виде дерева процессов.
Узнать сетевое имя машины вы можете с помощью команды hostname.
Скрипты
Для выполнения нескольких команд одним вызовом удобно использовать скрипты. Скрипт – это текстовый файл, содержащий команды для shell. Это могут быть как внутренние команды shell, так и вызовы внешних исполняемых файлов.
Как правило, имя файла скрипта имеет окончание .sh, но это не является обязательным требованием и используется лишь для того, чтобы пользователю было удобнее ориентироваться по имени файла. Для интерпретатора более важным является содержимое файла, а также права доступа к нему.
Перейдем в домашнюю директорию командой и создадим в ней с помощью редактора nano ()файл, содержащий 2 строки:
Чтобы выйти из редактора nano после набора текста скрипта, нужно нажать Ctrl+X, далее на вопрос «Save modified buffer?» нажать Y, далее на запрос «File Name to Write:» нажать Enter. При желании можно использовать любой другой текстовый редактор.
Скрипт запускается командой , т.е. перед именем файла указывает на то, что нужно выполнить скрипт или исполняемый файл, находящийся в текущей директории. Если выполнить команду , то будет выдана ошибка, т.к. оболочка будет искать файл в директориях, указанных в переменной среды PATH, а также среди встроенных команд (таких, как, например, pwd):
Ошибки не будет, если выполнять скрипт с указанием абсолютного пути, но данный подход является менее универсальным: . Однако на данном этапе при попытке выполнить созданный файл будет выдана ошибка:
Проверим права доступа к файлу:
Из вывода команды видно, что отсутствуют права на выполнение. Рассмотрим подробнее на картинке:
Права доступа задаются тремя наборами: для пользователя, которому принадлежит файл; для группы, в которую входит пользователь; и для всех остальных. Здесь r, w и x означают соответственно доступ на чтение, запись и выполнение.
В нашем примере пользователь (test) имеет доступ на чтение и запись, группа также имеет доступ на чтение и запись, все остальные – только на чтение. Эти права выданы в соответствии с правами, заданными по умолчанию, которые можно проверить командой . Изменить права по умолчанию можно, добавив вызов команды umask с нужными параметрами в файл профиля пользователя (файл ~/.profile), либо для всех пользователей в общесистемный профиль (файл /etc/profile).
Для того, чтобы установить права, используется команда . Например, чтобы выдать права на выполнение файла всем пользователям, нужно выполнить команду:
Чтобы выдать права на чтение и выполнение пользователю и группе:
Чтобы запретить доступ на запись (изменение содержимого) файла всем:
Также для указания прав можно использовать маску. Например, чтобы разрешить права на чтение, запись, выполнение пользователю, чтение и выполнение группе, и чтение – для остальных, нужно выполнить:
Будут выданы права :
Указывая 3 цифры, мы задаем соответствующие маски для каждой из трех групп. Переведя цифру в двоичную систему, можно понять, каким правам она соответствует. Иллюстрация для нашего примера:
Символ перед наборами прав доступа указывает на тип файла ( означает обычный файл, – директория, – ссылка, – символьное устройство, – блочное устройство, и т. д.). Соответствие числа, его двоичного представления и прав доступ можно представить в виде таблицы:
Число |
Двоичный вид |
Права доступа |
000 |
Нет прав |
|
1 |
001 |
Только выполнение (x) |
2 |
010 |
Только запись (w) |
3 |
011 |
Запись и выполнение (wx) |
4 |
100 |
Только чтение (r) |
5 |
101 |
Чтение и выполнение (rx) |
6 |
110 |
Чтение и запись (rw) |
7 |
111 |
Чтение, запись и выполнение (rwx) |
Выдав права на выполнение, можно выполнить скрипт:
Первая строка в скрипте содержит текст . Пара символов называется Шеба́нг (англ. shebang) и используется для указания интерпретатору, с помощью какой оболочки выполнять указанный скрипт. Это гарантирует корректность исполнения скрипта в нужной оболочке в случае, если у пользователя будет указана другая.
Также в скриптах можно встретить строку . Но, как правило, /bin/sh является ссылкой на конкретный shell, и в нашем случае /bin/sh ссылается на /bin/dash, поэтому лучше явно указывать необходимый интерпретатор. Вторая строка содержит команду , результат работы которой мы видим в приведенном выводе.
Основные команды
Отображает руководства по командам. К примеру, последующая команда выдаст вам все данные о команде cat:
$ man cat
Команда интерпретатора Bash cat
Cчитывает файл, переданный в качестве аргумента, с выводом его содержимого по стандартному каналу вывода. При передаче нескольких файлов в виде аргумента происходит вывод конкатенированного содержимого всех файлов.
Команда интерпретатора Bash echo
Осуществляет вывод своих аргументов по стандартному каналу вывода.
$ echo Hello World Hello World
При использовании без аргументов выводится пустая строка.
Команда интерпретатора Bash head
Читает лишь первые десять строк любого переданного текста, выводя их по стандартному каналу. Можно изменить количество выводимых строк:
$ head -50 test.txt
Команда интерпретатора Bash tail
Работает аналогично head, однако читает строки с конца:
$ tail -50 test.txt
Дополнительно есть возможность просматривания добавляемых к файлу строк в режиме реального времени, используя флаг -f:
$ tail -f test.txt
Команда интерпретатора Bash less
Позволяет перемещаться куску текста либо переданному файлу в обоих направлениях.
$ less test.txt $ ps aux | less
Кстати, о символе | мы расскажем ниже в блоке про команду интерпретатора Bash history.
Команды интерпретатора Bash true и false
Первая всегда возвращает ноль в качестве выходного статуса для индикации успеха, вторая, соответственно, не ноль в качестве выходного статуса для индикации неудачи.
$?
$? — это переменная, содержащая выходной статус последней запущенной команды. Выходной статус — код возврата программы. В нашем случае 0 будет означать успешное выполнение программы, а любое значение, которое больше нуля, будет отражать факт возникновения ошибок в процессе выполнения. Кстати, именно по этой причине в интерпретаторе Bash истиной (true) считается 0, а ложью (false) — всё, что не ноль.
$ true $ echo $? $ false $ echo $? 1
Команда интерпретатора Bash grep
Служит для поиска переданной строки в указанном файле:
$ cat users.txt user:student password:123 user:teacher password:321 $ grep 'student` file1.txt user:student password:123
Кроме того, может принимать несколько регулярных выражений и файлов для уточнения формата текста.
Команда интерпретатора Bash sed
Потоковый редактор, который преобразует входные текстовые данные. Используется для замены выражений следующим образом: s/regexp/replacement/g. К примеру, в следующем коде произойдёт замена всех слов «Hello» на «Hi»:
$ cat test.txt Hello World $ sed 's/Hello/Hi/g' test.txt Hi World
Руководство по sed.
Команда интерпретатора Bash history
Выводит историю командной строки. Часто используется совместно с grep при поиске конкретной команды. В коде ниже будут найдены все команды, которые содержат строку g++:
$ history | grep g++ 155 g++ file1.txt 159 g++ file2.txt
Кстати, здесь тоже можно увидеть символ | — это конвейер (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 (имя команды, запустившей процесс).
Закачивает файлы из интернета, помещая их в текущий каталог.
$ wget https://github.com/mikeizbicki/ucr-cs100
Команда интерпретатора Bash ping
Служит для тестирования сетевого подключения.
$ ping google.com PING google.com (74.125.224.34) 56(84) bytes of data. 64 bytes from lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms --- google.com ping statistics --- 1 packets transmitted, 1 received, % packet loss, time 8ms rtt min/avg/max/mdev = 7.794/8.422/10.792/0.699 ms
Статистика в конце отображает число подключений, которые были совершены до завершения команды. Также отображается время их выполнения.
Статья написана специально для курса по Linux на основании материалов Bash-Cheatsheet.
Что такое Bash?
Как я уже говорил, Bash — это интерпретатор команд. По сути, это обычная программа, которая запускается при старте сеанса оболочки. Мы могли бы запускать не Bash, а скажем, интерпретатор python или ruby, и тогда нам пришлось бы выполнять методы этих языков вместо команд Bash для администрирования системы.
Bash принимает команды от пользователя и передает их системному загрузчику, а также обеспечивает взаимодействие между командами, обмен информацией и потоками ввода-вывода. Также оболочка предоставляет пользователю удобный интерфейс для работы с историей команд, поиска и замены, а также исправления ранее выполненных команд, а также автодополнение путей.