Абсолютные и относительные пути
Абсолютные пути начинаются с / и однозначны из любого каталога; относительные начинаются с текущего рабочего каталога и короче, но зависят от контекста. . — текущий каталог, .. — родитель, ~ — домашний.
Ты уже знаешь, что pwd говорит, где ты находишься, а cd перемещает тебя. Но каждая команда, работающая с файлом — cp, mv, cat, rm — требует, чтобы ты назвал этот файл. Есть два принципиально разных способа назвать путь, и их путаница вызывает ошибки «No such file or directory», которые кажутся загадочными, пока различие не станет ясным.
К концу урока ты сможешь называть любой файл в системе двумя способами: абсолютным путём, который работает откуда угодно, и относительным путём, который короче, но зависит от текущей позиции.
После этого урока ты сможешь составить абсолютный путь (начинающийся с /) для достижения любого файла из любого рабочего каталога, составить относительный путь, используя ., .. и имена каталогов, и объяснить, почему один и тот же относительный путь может указывать на разные файлы в зависимости от того, откуда ты его запускаешь.
Дерево файловой системы имеет один корень: /. Каждый путь на Linux в конечном счёте восходит к единственному каталогу /. Под ним находятся /home, /etc, /var, /usr и другие. Файл по адресу /home/alice/notes.txt живёт именно в этом месте дерева — никакой неоднозначности, где бы ты ни стоял.
/
├── home/
│ └── alice/
│ └── notes.txt
├── etc/
│ └── hosts
└── var/
└── log/Абсолютный путь начинается с / и описывает полный маршрут от корня. Поскольку он начинается с корня, он означает одно и то же независимо от текущего каталога:
cat /home/alice/notes.txt
cat /etc/hostsОба работают, находишься ли ты в /, /tmp или /home/alice/projects. Путь самодостаточен.
Относительный путь начинается с рабочего каталога — у него нет ведущего /. Оболочка добавляет перед ним текущий каталог для разрешения пути. Если ты находишься в /home/alice:
cat notes.txtОболочка разрешает это как /home/alice/notes.txt. Если бы ты был в /tmp, та же команда искала бы /tmp/notes.txt — совершенно другой файл или ошибку «No such file».
В этом и ловушка: относительные пути меняют смысл при смене рабочего каталога.
Три специальных имени помогают навигации без написания полных путей.
.— сам текущий каталог.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».
Когда использовать абсолютный 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.pycat: 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-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.