Поэтому я пишу небольшой менеджер пакетов, и я столкнулся с проблемой создания символических ссылок на файлы.
Он устанавливает пакет /usr/pkg/name-version
, а затем читает файл, чтобы определить, какие символические ссылки создать. Я использую ln
для создания ссылок, и я столкнулся с проблемой при попытке установить заголовки API Linux. Мне нужно связать сами заголовочные файлы, а не папки, в которых они содержатся (поэтому, если 2 пакета должны поместить файлы в один и тот же подкаталог include, они могут без использования одного пакета).
Эту проблему я решил, но ln
просто выдает ошибку, если путь не полный, что раздражает, потому что эти каталоги не должны существовать, пока не будет установлен пакет.
Есть ли флаг ln
, который создаст какие-либо отсутствующие каталоги, или мне придется использовать какой-нибудь замысловатый скрипт bash?
mkdir
... для создания каталогов?lndir
.Ответы:
Вам не понадобится замысловатый сценарий bash, а простая однострочная.
mkdir --parents
позаботится обо всем, даже не печатая ошибку, если структура каталогов уже существует.Просто будьте осторожны с тем, как вы относитесь к этим каталогам при удалении, чтобы не сломать другие пакеты.
Кроме того, так как вы пишете это
bash
, вы можете взглянуть на волшебство (бесстыдная вилка). Может быть, было бы проще просто изменить это, так как он зрелый и гибкий.источник
system()
это не так просто, очень трудно правильно избежать аргументов командной строкиsystem()
. По крайней мере, вы должны использоватьposix_spawn()
илиfork()+exec*()
, который принимает аргументы командной строки в качестве массивов.Там нет флага, чтобы сделать это с
ln
. Создание каталогов это не его работа.mkdir -p foo/bar/qux
будет создаватьfoo
,foo/bar
и поfoo/bar/qux
мере необходимости. Поэтомуmkdir -p
сначала вызовите все, кроме последнего компонента пути.Похоже, вы изобретаете
колесоStow , простой менеджер пакетов, который объединяет иерархии каталогов, создавая каталоги необходимой глубины с символическими ссылками на компоненты различных пакетов внутри. Или, возможно, XStow , который похож на Stow, но имеет больше возможностей для настройки.источник
Может быть,
tar
может помочь подготовить файл со ссылками:А затем создать ссылки, где это необходимо:
источник