Навигация в файловой системе #
Андрей Михайлович Васильев, 2023
Версии презентации
Структура команд Bash #
После ввода команды в эмулятора терминала и нажатия клавиши Enter строка передаётся в командный интерпретатор
Общая структура простого запроса интерпретатору
команда --аргумент1 аргумент2 аргумент3
Интерпретатор разбивает пришедшую строку на слова по непечатным символам
Команда определяет действие, которое вы хотите выполнить, а аргументы уточняют поведение. Точное воздействие аргументов зависит от разработчиков конкретной команды, один и тот же аргумент по названию может по-разному интерпретироваться
- Команда
cd
меняет рабочий каталог, её необязательный аргумент говорит куда надо его изменить - Команда
touch
создаёт файлы, аргументы указывают какие файлы надо создать и в каком состоянии
Аргументы, параметры и ключи #
- На первом месте в выражении, которое передаётся интерпретатору, находится команда для исполнения
- Все остальные элементы называются аргументами или параметрами
- Аргументы делятся на 2 группы: позиционные аргументы и ключи
- Ключи обычно не являются обязательными для указания
- Ключи модифицируют поведение приложения
- Смысл ключа зависит от его названия и его значения
- Смысл позиционного аргумента зависит от его значения
- Позиционные аргументы часто являются обязательными, например указывают путь к файлу с данными для обработки
- Разработчик может использовать каждый из этих элементов на своё усмотрение
- Порядок аргументов зачастую важен, следует уделять этому внимание
Команду в Bash можно рассмотреть как вызов функции: на первом месте находится её название, а далее перечислены аргументы
Получение аргументов #
В рамках языка Си приложение получает данные через аргументы функции main
:
int main(int argc, char* argv[])
- Переменная
argc
содержит количество аргументов приложения - Переменная
argv
содержит список ссылок на строки
Компиляция Си-приложений #
Для компиляции Си-приложений необходим компилятор языка cc
:
cc main.c -o app
В рамках GNU/Linux самым распространённым компилятором является компилятор GNU C Compiler, gcc
Реализация обработки аргументов #
Разработчики стремятся снизить свою задачу, а также предоставить пользователям знакомый интерфейс для работы, поэтому используют «стандартные» библиотеки
Для языка Си в GNU/Linux доступны следующие библиотеки для обработки аргументов приложения:
-
#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring);
-
#include <argp.h> error_t argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags, int *arg_index, void *input)
Другие языки программирования предлагают свои библиотеки, чьё поведение схоже с поведением данных двух библиотек
Короткие ключи #
Короткий, однобуквенный ключ: -l -a
- Состоит из одного символа
- Перед символом ставится один дефис
- Обычно служит для включения или выключения одного аспекта поведения приложения
- Короткие ключи можно комбинировать:
ls -l -a
,ls -al
Ключи могут:
- Иметь логическое значение: указан / не указан
- Для приложения
ls
если указан флаг-a
, то надо выводить все файлы - Зачастую ключи несут именно логическое значение
- Для приложения
- Может иметь значение. Рассмотрим команду
cal -c 2 2023
- Ключ
-c
, количество колонок, принимает в качестве аргумента число2
- Аргумент
2023
— позиционный, указывает год, для которого надо показать календарь
- Ключ
Длинные ключи #
Длинный ключ: --size --width=100
- Состоит из одного слова
- Перед словом стоит двойной дефис
- Может служить переключателем, как и короткий ключ
- Может принимать значение
- Обычно человек может воспринять без чтения документации
- Для указания значения такому ключу необходимо его передать с помощью символа
=
или указать его после пробела
Некоторые ключи имеют как короткую, так и длинную форму
- Короткие ключи позволяют экономить время на набор
- Значение длинных ключей зачастую легче понять при считывании
- Короткие ключи можно объединять друг с другом в отличие от длинных
Разные типы команд #
В первой части запроса к интерпретатору находится команда, которую можно отнести к одной из следующих категорий
- Внутренние команды интерпретатора
- Внешний по отношению к интерпретатору исполняемый файл
- Внутренние команды интерпретатора зачастую изменяют его внутреннее состояние и не изменяют ничего вне своего процесса
- Запуск внешнего приложения зачастую не изменяет внутреннее состояние интерпретатора
- Внутренние и внешние команды могут быть скомбинированы
Определение типа команд #
В Bash для определения типа команд можно воспользоваться встроенной командой type
Типичные примеры использования type
:
$ type cd
cd — это встроенная команда bash
$ type mkdir
mkdir является /bin/mkdir
$ type ls
ls — это псевдонимом для «ls --color=auto»
Внутренние команды Bash #
Внутри интерпретатора Bash можно выделить следущие 3 категории доступных команд
- Встроенные команды интерпретатора,
builtin
- Функции интерпретатора,
function
- Псевдонимы интерпретатора,
alias
Встроенные команды интерпретатора builtin
#
Данные команды направлены для управления состоянием интерпретатора, а не на прямое взаимодействие с внешним окружением
Перечислим знакомые нам встроенные команды:
cd
— изменение рабочего каталога интерпретатораexit
— завершение работы интерпретатораtype
— определение типа команды
Получение помощи по встроенной команде #
Для получения информации о функционировании встроенной команды используется встроенная команда help
:
$ help cd
...
$ help help
...
Разбор описания помощи для встроенных команд #
$ help cd
cd: cd [-L|[-P [-e]] [-@]] [каталог]
Change the shell working directory.
Первая строка кратко описывает какие аргументы можно передавать команде
[-@]
указывает, что аргумент-@
является опциональным: его можно указывать, а можно и не указывать|
указывает на то, что есть 2 взаимоисключающих варианта
Порядок аргументов зачастую важен! Например для команды cd
нельзя указать каталог до других аргументов
У команды cd
нет ни одного обязательного аргумента
Разбор описания помощи. Продолжение #
После текстового описания команды идёт блок с описанием каждого поддерживаемого аргумента
Options:
-L force symbolic links to be followed: resolve symbolic
links in DIR after processing instances of `..'
-P use the physical directory structure without following
symbolic links: resolve symbolic links in DIR before
processing instances of `..'
-e if the -P option is supplied, and the current working
directory cannot be determined successfully, exit with
a non-zero status
Работа с псевдонимами alias
#
При долгой работе с командным интерфейсом иногда хочется выполнять ряд действий быстрее. Для решения этой задачи можно ввести псевдоним команды
Для управления псевдонимами используется команда alias
$ type alias
alias — это встроенная команда bash
Для отображения списка псевдонимов вызовите команду без аргументов
Для определения псевдонимов надо воспользоваться
alias: alias [-p] [имя[=значение] ... ]
Если не указать аргументы, alias выводит список псевдонимов
в виде «alias имя=значение» на стандартный вывод.
Определение и использование псевдонимов #
Например нам необходимо часто просматривать права доступа к файлам и вызывать ls -l
. Мы хотим сэкономить время на набор команды, поэтому добавляем псевдоним ll
:
$ alias ll='ls -l'
$ alias
alias ll='ls -l'
alias ls='ls --color=auto'
$ ll
итого 20
drwx------ 3 root root 60 сен 12 07:41 alsa
drwxr-xr-x 2 avahi avahi 80 сен 12 07:41 avahi-daemon
...
Время жизни псевдонима #
Определение псевдонима — действие по настройке интерпретатора Bash, как и изменение текущего рабочего каталога
При завершении сессии, при старте новой сессии состояние сбрасывается на начальное и все команды, которые были определены с помощью alias
, будут недоступны
Чтобы эти псевдонимы были доступны всегда, их надо описать внутри конфигурационного файла bash, который считывается при каждом старте интерпретатора:
~/.bashrc
Удаление псевдонима #
Для удаления псевдонима используется команда unalias
Получение помощи по функциям и псевдонимам #
Функции и псевдонимы не предоставляют средств для получения документации по своей работе
Единственный способ — это прочитать исходный их исходный код
Вывод:
- при написании функций на любом языке программирования стоит документировать её поведение
- псевдонимы хороши для каждого конкретного человека или компании
- если приходится часто повторять какие-то команды, то удобно определить псевдоним
Получение помощи по приложениям #
$ type touch
touch является /bin/touch
Хорошие консольные приложения предоставляют встроенную помощь по использованию, которую можно посмотреть с помощью аргумента --help
$ mkdir --help
Использование: mkdir [КЛЮЧ]… КАТАЛОГ…
Создает КАТАЛОГ(и), если он ещё не существует.
Аргументы, обязательные для длинных ключей, обязательны
и для коротких.
-m, --mode=РЕЖИМ установить права доступа к файлу
(как в chmod), а не a=rwx - umask
-p, --parents не выдавать ошибку, если существует,
создавать родительские каталоги,
если необходимо
-v, --verbose печатать сообщение о каждом созданном
каталоге
Не все приложения поддерживают данный аргумент, но большинство хороших поддерживают (встроенная функциональность
Получение информации из руководства #
Много приложений предоставляют информацию о своём использовании в формате руководства в системе man
Для получения руководства с названием program
достаточно запустить приложение и в качестве аргумента передать ему program
man program
Если руководство будет найдено, то оно будет отображено с помощью приложения для просмотра текстовых документов less
Задача просмотра текста #
При появлении текстовых терминалов встала задача: просмотреть большой текстовый документ при наличии всего 24 строк в выводе
Решение: использовать приложение-пейджер для постраничного просмотра текстовых файлов
- Пользователь открывает текстовый файл для чтения
- Приложение показывает первую страницу, 25 строк
- Пользователь нажимает пробел
- Приложение показывает вторую страницу
Классическая реализация приложения — more
Интерактивное приложение less
#
less
— интерактивное приложение для просмотра текстов, less is more
less data.txt
Приложение после запуска продолжает работать, предоставляя возможности по навигации с текстом
Поддерживаемые горячие клавиши:
Page UP
,b
подняться на страницу вверхPage Down
,space
,d
опуститься на страницу внизСтрелка ввех
подняться на одну строкуСтрелка вниз
опуститься на одну строкуG
перейти к концу текстового файла1G
илиg
перейти к началу файла/СТРОКА
начать поиск вниз до следующего вхождения строкиСТРОКА
n
повторить поиск и переходh
показать поискq
завершить работуless
Разбор структуры man-страниц #
Посмотрим на руководство по приложению cp
$ man cp
CP(1) User Commands
NAME
cp - copy files and directories
SYNOPSIS
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
DESCRIPTION
Copy SOURCE to DEST, or multiple SOURCE(s) to
DIRECTORY.
-a, --archive
same as -dR --preserve=all
Разделы man-руководств #
- Исполняемые программы или команды оболочки (shell)
- Системные вызовы (функции, предоставляемые ядром)
- Библиотечные вызовы (функции, предоставляемые программными библиотеками)
- Специальные файлы (обычно находящиеся в каталоге /dev)
- Форматы файлов и соглашения, например о /etc/passwd
- Игры
- Разное (включает пакеты макросов и соглашения), например man(7), groff(7)
- Команды администрирования системы (обычно, запускаемые только суперпользователем)
- Процедуры ядра [нестандартный раздел]
Просмотр руководства из нужного раздела #
man man
СИНТАКСИС
man [параметры man] [[раздел] страница ...] ...
Просмотр информации об использовании приложения passwd
$ man 1 passwd
passwd(1) Пользовательские команды
НАЗВАНИЕ
passwd - изменяет пароль пользователя
Просмотр информации о конфигурационном файле passwd
$ man 5 passwd
passwd(5) Форматы файлов
НАЗВАНИЕ
passwd - файл паролей
Поиск информации по man-страницам #
Существует множество страниц с разными названиями, которые могут не совпадать с названием приложения
Для поиска руководств можно воспользоваться:
- приложением
apropos
:apropos passwd
- приложением
man
:man -k passwd
chpasswd (8) - обновляет пароли в пакетном режиме
gpasswd (1) - administer /etc/group and /etc/gshadow
passwd (1) - изменяет пароль пользователя
Руководства в файловой системе #
Руководства справочной системы man
находятся в файловой системе
Каталоги, в которых происходит их поиск, описаны в конфигурационном файле /etc/man_db.conf
MANDATORY_MANPATH /usr/man
MANDATORY_MANPATH /usr/share/man
MANDATORY_MANPATH /usr/local/share/man
Дополнительная документация #
Множество приложений помимо установки могут поставлять документацию в любом удобном для них формате. Обычно документация располагается в каталоге /usr/share/doc/
, в подкаталоге с именем приложения.
Для простых приложений там может располагаться текстовый файл README
, который можно посмотреть с помощью less
Некоторые файлы могут иметь расширение .gz
, что обозначает что они заархивированы. less
тоже может их открыть и просмотреть, если они текстовые
Запуск приложений #
Если пользователь хочет запустить приложение, то существуют 2 пути:
- Указание пути к исполняемому файлу на файловой системе
- Указание названия исполняемого файла для поиска по списку директорий
При указании пути необходимо явно сообщить, что мы указали путь:
/usr/bin/mkdir
— абсолютный путь, первый символ/
./app.py
— относительный путь, первый символ.
Вы не можете использовать относительные пути без указания локального имени каталога
Если не задан символ /
или .
, то будет происходить поиск по директориям
Где Bash ищет исполняемые файлы #
Переменная окружения PATH
определяет список директорий, в котором Bash ищет исполняемые файлы, которые мы можем вызвать
Для просмотра текущего значения переменной PATH
можно воспользоваться
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games
Пути в списке разделены двоеточием
Поиск исполняемых файлов происходит в порядке указания каталогов:
/usr/local/bin
/usr/bin
/bin
/usr/games
Перекрытие одних исполняемых файлов другими #
Если в каталогах /usr/bin
и /bin
есть исполняемые файлы с одинаковыми именами, то будет запущен файл из /usr/bin
, так как в списке он идёт раньше /bin
/usr/bin/application
/bin/application
Если пользователь запустит приложение application
в командном интерфейсе, то будет запущен исполняемый файл /usr/bin/application
, а не /bin/application
Определение пути к исполняемому файлу #
Для определения абсолютного пути к исполняемому файлу используйте which
$ man which
NAME
which - locate a command
SYNOPSIS
which [-a] filename ...
Троеточие обозначает, что команде можно передать несколько названий приложений одновременно
$ which mkdir which
/usr/bin/mkdir
/usr/bin/which