Linux: использование командной строки
Большинство проектов построено на Linux. Какими бы инструментами вы не пользовались, в какие бы кластеры не деплоилось ваши приложения, всё равно в основе этого с высокой долей вероятности будет лежать Linux.
У Linux очень хорошая документация, к которой всегда можно обратиться в случае возникновения вопросов.
Давайте начнём с основ - то есть с работы в консоли.
Как уже упоминалось, в Linux очень хорошая документация. Используйте команду man или ключ --help/-h. Это позволит вам понять как пользоваться любой другой командой.
Файловая система Linux имеет иерархическую или древовидную структуру. Имеется корневая точка монтирования и от неё идёт вся структура файловой системы. Здесь нет дисковых разделов, таких как в Windows.
Для навигации по файловой системе можно пользоваться одной единственной командной - cd, которая расшифровывается как change directory.
cd принимает аргументом путь, куда вы хотите перейти. Пути разделяются на относительный и абсолютный. Относительный - относительно вашей текущей директории где вы находитесь. Абсолютный - это полный путь, начиная с корневой директории.
ls - позволяет посмотреть содержимое директории или атрибуты файла. Принимает множество аргументов. Основная, на мой взгляд, вариация команды это ls -lha, где
Остальные базовые командам для работы в терминале:
Переменные окружения - это набор пар ключ-значение, которые доступны другим процессам.
Для получения списка переменных окружения можно использовать команду env, а для более удобного просмотра - перенаправить её вывод в команду more или less через пайп env | less. Про пайпы поговорим немного позже.
Для получения значения из консоли можно сделать обращение через $VARIABLE. К примеру для вывода значения в консоль echo $VARIABLE.
Для установки нового значения нужно вставить в командную строку следующую пару:
VARIABLE=VALUE или команду export VARIABLE=VALUE. Команда export обеспечивает то, что все дочерние процессы от вашей командной строки также будут наследовать значение данной переменной.
'[root@li2155-195 ~]# TEST_VAR=test_value [root@li2155-195 ~]# echo $TEST_VAR test_value [root@li2155-195 ~]# bash [root@li2155-195 ~]# echo $TEST_VAR [root@li2155-195 ~]# exit [root@li2155-195 ~]# exp ort TEST_VAR [root@li2155-195 ~]# bash [root@li2155-195 ~]# echo $TEST_VAR test_value'
Для того чтобы убрать переменную можно присвоить ей нулевое значение или использовать команду unset.
[root@li2155-195 ~]# unset TEST_VAR [root@li2155-195 ~]# echo $TEST_VAR
Существует два вида терминалов в Linux: tty и pty:
Понятие этих терминалов является наследием первых tele-type терминалов, которые использовались для ввода/вывода и работы с первыми компьютерами. По сути это line-by-line ввод и вывод.
В самом Linux tty - это непосредственно ваши клавиатура и монитор, то есть физическое воплощение терминала. В то время как pty - это программная реализация терминала, необходимая для некоторых программ. Например, для удалённого подключения к машине через ssh.
Для примера можно посмотреть переменную окружения через ssh подключения которая указывает наш текущий терминал echo $SSH_TTY.
Сравнительно полезный трюк, можно перенаправлять вывод из одного псевдо-терминала в другой. Давайте посмотрим это на практике.
Две консоли, вывести в двух номера псевдо-терминалов: echo $SSH_TTY. Далее тестовая команда вроде
echo 'hello' > /dev/pts/1.
Теперь давайте рассмотрим, что такое оболочки терминала и какие существуют.
Оболочка терминала, это интерпретатор команд, который передаёт ваши команды в API ядра Linux. Эти оболочки бывают разными, и отличаются своим функционалом. Базово всегда присутствует интерпретатор sh, функционал которого не беден, но неприятен в управлении. Далее идёт самый популярный интерпретатор, который включен практически в любой Linux дистрибутив - bash, расшифровывается как bourne again shell. Включает в себя автодополнение, профили, и множество других полезных функций. Далее идут различные интерпретаторы вроде zsh, который лично я бы рекомендовал,а также fish, ksh и так далее. Все они отличаются функционалом и расширяемыми плагинами.
Не важно, где в файловой системе находятся исполняемые файлы (не обязательно бинарные), так как любой файл можно передать интерпретатору для запуска в виде ./command. Однако, если вы не хотите использовать постоянно запуск с полным или относительным путём, вы можете использовать дополнение переменной окружения $PATH, которая содержит в себе пути, где система будет искать вводимые команды по умолчанию.
Давайте посмотрим на формат содержимого этой переменной:
[root@li2155-195 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Как мы видим, это набор путей которые разделены двоеточиями. Для того, чтобы добавить, можно использовать следующую комбинацию команд:
[root@li2155-195 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@li2155-195 ~]# export PATH=$PATH:/root/new_bin_folder [root@li2155-195 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/new_bin_folder
Пакетных менеджеров существует довольно много, но большинство серверных систем и Docker образов основаны на трёх семействах Debian, Centos(Redhat) и Alpine. Так что список того что нам нужно рассмотреть ограничивается менеджерами apt-get, yum и apk соответственно.
Вы можете установить пакетные менеджеры на другие системы, но это это не распространено.
Давайте рассмотрим принципы работы пакетных менеджеров.
Пакет представляет собой набор из бинарных файлов, контрольной суммы, метаданных, конфигурационных файлов, зависимостей, версии и так далее. Метаданные при установке сохраняются в базе данных пакетного менеджера, что позволяет отслеживать и управлять пакетами в системе. Пакеты могут устанавливаться вручную или автоматически, используя репозиторий.
Для систем семейства Debian характерно использование пакетного менеджера apt-get и apt. Разница между ними в том, что apt являются надстройкой написаной на Python и использующей apt-get и еще несколько утилит для менеджмента пакетов, cache и репозиториев в системе.
В системах семейства CentOS и Redhat используется пакетный менеджер yum который, начиная с восьмой версии CentOS, заменён на dnf. Связано это с тем, что yum имел недостатки в виде низкой производительности и высокого потребления памяти.
В Alpine Linux используется пакетный менеджер apk или alpine packet manager. Отличается низким уровнем кэширования и использованием строго необходимых зависимостей для установки пакетов. Важно знать о нем, так как на базе alpine linux зачастую собираются образы в силу малого размера базового образа с системой.