Распространённые действия

Жёсткие и мягкие ссылки

Иногда бывает полезно дать доступ к какому-то файлу не из той папки, в которой он расположен, а из другой (или же — по другому названию).

Для этого существует механизм ссылок, которые бывают двух типов:

  • жёсткие — так называются имена одного и того же файла (файловые системы, использующиеся POSIX-совместимыми ОС, поддерживают наличие у одного и того же набора данных более одного имени, по которому этот набор доступен)
  • мягкие — это специальные файлы, хранящие внутри себя некоторый путь; при этом почти все операции ввода/вывода, получающие на вход имя файла, применённые к мягкой ссылке, переадресуются на тот путь, который мягкая ссылка в себе хранит

Как нетрудно заметить, любой файл по определению является жёсткой ссылкой. Дополнительную жёсткую ссылку можно создать командой ln старое_имя новое_имя.

Жёсткие ссылки можно перемещать и удалять. При этом содержимое файла будет удалено лишь после удаления всех жёстких ссылок этого файла. Друг от друга жёсткие ссылки одного и того же файла неотличимы.

Мягкую ссылку можно создать командой ln -s путь имя_ссылки. Настоятельно рекомендуется указывать абсолютный путь. За исключением, конечно же, тех случаев, в которых Вам зачем-то нужна ссылка именно на относительный путь (поведение такой ссылки, очевидно, зависит от текущей рабочей папки).

Переключение между пользователями

Осуществляется командой su. Также в системе может быть установлена программа sudo, позволяющая выполнить указанную команду от имени пользователя-администратора.

Управление правами

Здесь мы опишем основы системы прав пользователей в POSIX-совместимых ОС.

В основе системы прав пользователей лежат две сущности:

  • пользователи
  • группы

Каждый пользователь может «являться членом» произвольного подмножества множества всех групп.

У каждого файла или папки есть:

  • пользователь-владелец (изменяется программой chown)
  • группа (изменяется программой chgrp)
  • права доступа для владельца
  • права доступа для группы
  • права доступа для всех остальных

Есть три основных права:

  • право на чтение (r)
  • право на изменение (w)
  • право на выполнение (x)

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

Второе даёт возможность открыть файл в режиме записи или дозаписи или же создавать и удалять файлы в папке.

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

Более редкие права (setuid, setgid, restricted deletion) описаны в документации к программе chmod, которая позволяет изменять права доступа.

Права для владельца, группы и всех остальных являются взаимоисключающими:

  • пользователь root (администратор) может делать всё, что угодно
  • к владельцу файла применяются права владельца
  • к невладельцу, но члену группы файла применяются права группы
  • ко всем остальным применяются права всех остальных

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

Архивация и сжатие

Обычно архивация данных (объединение нескольких файлов в один) и сжатие (среднестатистическое уменьшение размера файла) осуществляется при помощи программы tar (впрочем, есть ещё ar и jar с другими форматами архивов, но ровно таким же текстовым интерфейсом).

Стандартный способ создать архив следующий:

  • создать папку foo
  • переменстить в папку foo всё, что нужно
  • выполнить команду tar cvzf foo.tar.gz foo

Для того, чтобы такой архив распаковать в текущую папку, достаточно выполнить команду tar xvzf foo.tar.gz.

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

Часто применяемые разновидности команды tar:

  • tar tzf foo.tar.gz — посмотреть содержимое архива
  • tar cvf foo.tar foo — сделать несжатый архив (работает быстрее, чем архивирование со сжатием)
  • tar xvf foo.tar — распаковать несжатый архив
  • tar tf foo.tar — просмотреть содержимое несжатого архива
  • буква v во всех вышеописанных командах отвечает только за то, что печатается во время работы архиватора; можно её и не ставить — тогда архиватор будет работать молча
  • буква z отвечает за алгоритм сжатия gzip; из распространённых алгоритмов есть ещё j (обычно названия таких архивов заканчиваются на bz, bz2 или bzip2) и J (названия таких архивов обычно заканчиваются на xz)

Сборка приложений

Обычно при сборке хоть сколько-то нетривиальных приложений требуется какое-то количество нетривиальных действий вида:

  • сделать какие-то файлы таким-то образом
  • на основе этих файлов сгенерировать ещё какие-то файлы
  • на основе сгенерированных файлов сделать ещё что-то
  • и так далее

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

Многие языки программирования поставляются со своими собственными системами сборки (которые зачастую ещё и совмещены с системами управления пакетами и зависимостями). Но есть и несколько универсальных, наиболее распространённой из которых является GNU Make.

Принцип работы GNU Make максимально примитивен:

  • в специальном файле (который обычно называется Makefile) описываются компоненты приложения (на Make-жаргоне они называются «целями»)
  • для каждой цели указываются её зависимости — имена файлов
  • также для каждой цели указывается процедура её сборки — набор команд для стандартного интерпретатора команд; считается, что итогом этого набора команд должен стать файл, имя которого совпадает с именем цели

Make (запускается командой make имя_цели или просто make, если нужно собрать самую первую цель из Makefile) работает по примерно следующему алгоритму:

  • для указанной цели, а также — каждой цели, связанной с указанной отношением зависимости, проверяет её актуальность
  • а именно, каждая такая цель должна существовать и быть изменена не раньше, чем любая из её зависимостей
  • все неактуальные цели пересобираются при помощи соответствующих наборов команд (в таком порядке, что любая зависимость пересобирается до той цели, которая от неё зависит)

Синтаксис Makefile в первом приближении следующий:

  • каждая цель оформляется так имя_цели: зависимость1 зависимость2 зависимость3 (зависимости указываются через пробелы, этих самых зависимостей может быть любое число, хоть даже ноль)
  • после цели идут команды, каждая команда предваряется символом табуляции (именно табуляцией, а не несколькими пробелами!)

Также отметим, что часто в Makefile встречаются псевдоцели (all, install, clean и прочее подобное), предназначенные для запуска каких-то служебных сценариев. Для того, чтобы такие цели не приводили к проверке наличия и актуальности соответствующих файлов, их нужно указать как зависимости специальной цели .PHONY).

О более сложных сценариях использования GNU Make рекомендуем прочитать в документации.