open atlas
↑ К треку
Командная строка CLI · 02 · 01

Абсолютные и относительные пути

Абсолютные пути начинаются с / и однозначны из любого каталога; относительные начинаются с текущего рабочего каталога и короче, но зависят от контекста. . — текущий каталог, .. — родитель, ~ — домашний.

CLI Основы ◷ 18 min
Уровень
ОсновыJuniorMiddleSenior

Ты уже знаешь, что pwd говорит, где ты находишься, а cd перемещает тебя. Но каждая команда, работающая с файлом — cp, mv, cat, rm — требует, чтобы ты назвал этот файл. Есть два принципиально разных способа назвать путь, и их путаница вызывает ошибки «No such file or directory», которые кажутся загадочными, пока различие не станет ясным.

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

Цель

После этого урока ты сможешь составить абсолютный путь (начинающийся с /) для достижения любого файла из любого рабочего каталога, составить относительный путь, используя ., .. и имена каталогов, и объяснить, почему один и тот же относительный путь может указывать на разные файлы в зависимости от того, откуда ты его запускаешь.

1

Дерево файловой системы имеет один корень: /. Каждый путь на Linux в конечном счёте восходит к единственному каталогу /. Под ним находятся /home, /etc, /var, /usr и другие. Файл по адресу /home/alice/notes.txt живёт именно в этом месте дерева — никакой неоднозначности, где бы ты ни стоял.

/
├── home/
│   └── alice/
│       └── notes.txt
├── etc/
│   └── hosts
└── var/
    └── log/
2

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

cat /home/alice/notes.txt
cat /etc/hosts

Оба работают, находишься ли ты в /, /tmp или /home/alice/projects. Путь самодостаточен.

3

Относительный путь начинается с рабочего каталога — у него нет ведущего /. Оболочка добавляет перед ним текущий каталог для разрешения пути. Если ты находишься в /home/alice:

cat notes.txt

Оболочка разрешает это как /home/alice/notes.txt. Если бы ты был в /tmp, та же команда искала бы /tmp/notes.txt — совершенно другой файл или ошибку «No such file».

В этом и ловушка: относительные пути меняют смысл при смене рабочего каталога.

4

Три специальных имени помогают навигации без написания полных путей.

  • . — сам текущий каталог. cat ./notes.txt идентично cat notes.txt; ./ просто явно указывает, что путь относительный.
  • .. — родительский каталог. Из /home/alice/projects, ../notes.txt указывает на /home/alice/notes.txt.
  • ~ — разворачивается в твой домашний каталог (например, /home/alice). ~/notes.txt всегда означает /home/alice/notes.txt независимо от того, где ты находишься.

Их можно соединять: ../../etc/hosts означает «подняться на два уровня, затем спуститься в etc/hosts».

5

Когда использовать абсолютный vs относительный путь. Используй абсолютный путь, когда команда должна работать из любого каталога — скрипты, задания cron и команды, запускаемые из неизвестных мест, почти всегда должны использовать абсолютные пути. Используй относительный путь для интерактивной работы, когда ты уже рядом с целью и набирать полный путь утомительно. ~ — это золотая середина: выглядит как относительный, но всегда разрешается в одно и то же место.

Разбор примера

Называем один и тот же файл двумя способами.

Предположим, твой домашний каталог — /home/alice, и у тебя есть файл /home/alice/projects/app/main.py.

Из /home/alice/projects/app (ты прямо рядом с файлом):

# относительный — короткий
cat main.py

# абсолютный — многословный, но надёжный
cat /home/alice/projects/app/main.py

# через ~ — всегда разрешается к домашнему каталогу
cat ~/projects/app/main.py

Теперь перейди в /tmp и попробуй относительный путь:

cd /tmp
cat main.py
cat: main.py: No such file or directory

Абсолютный вариант и вариант с ~ по-прежнему работают из /tmp. Относительный завершается ошибкой, потому что /tmp/main.py не существует.

Почему это работает

На macOS правила путей идентичны: / — это корень, абсолютные пути начинаются с /, а ./../~ работают так же. Домашний каталог — /Users/alice вместо /home/alice, но ~ всегда раскрывается правильно, поэтому код, использующий ~, переносим между Linux и macOS.

Частая ошибка

Распространённая ошибка в скриптах — использование относительного пути для файла, находящегося рядом со скриптом. Если скрипт вызывается из другого рабочего каталога, относительный путь ломается. Всегда используй $(dirname "$0") или абсолютный путь, построенный на его основе, когда файл должен быть рядом со скриптом:

# ненадёжно — ломается, если вызвать скрипт из /tmp
cat config.txt

# надёжно — работает откуда угодно
cat "$(dirname "$0")/config.txt"
Проверь себя
Викторина

Твой рабочий каталог — /var/log. Ты запускаешь: cat ../etc/hosts. Какой файл на самом деле открывает оболочка?

Итог

Каждый файл на Linux живёт в уникальном месте единого дерева с корнем /. Абсолютный путь начинается с / и однозначно идентифицирует файл из любого рабочего каталога. Относительный путь не имеет ведущего / и разрешается путём добавления текущего рабочего каталога перед ним — он короче, но зависит от контекста. Специальные имена . (текущий каталог), .. (родительский каталог) и ~ (домашний каталог) могут появляться в любом месте относительного пути. Для скриптов и автоматизированных задач предпочитай абсолютные пути или пути с привязкой к ~, чтобы избежать сюрпризов «файл не найден» при смене рабочего каталога.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.