Symial aliasing файлы в подкаталогах без изменения текущего каталога

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

mkdir temp cd temp mkdir deploy echo "Contents of the build file!" > deploy/resources.build.php ln -s deploy/resources.build.php deploy/resources.php cat deploy/resources.php #bad symlink 

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

 ln -s deploy/resources.build.php resources.php cat deploy/resources.php 

Также не работает, потому что он создает символическую ссылку в каталоге temp вместо подкаталога deploy.

 cd deploy ln -s resources.build.php resources.php cd .. 

Это работает, но я бы предпочел знать, как это сделать, не меняя каталогов.

Используя полный путь, например:

 /home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php 

Работает, но не имеет большого значения и несколько непрактично, особенно в среде сборки, где все элементы проекта могут быть разными между сборками и т. П.

Как создать символическую ссылку между двумя файлами в подкаталоге, не перемещаясь в этот подкаталог и из него, а при добавлении нового файла «псевдоним» – новое имя?

  • Файловая система Docker - совместимость с символическими ссылками
  • Как создать командный ярлык для файла .sh?
  • Создайте новую ссылку для доступа ко всем файлам и папкам
  • читать только символическую ссылку или что-то подобное?
  • ln дает разные результаты при многократном запуске
  • Скопировать символическую ссылку И где она указывает на использование rsync
  • Bash, когда мой домашний каталог является символической ссылкой
  • rsync: сравнить каталоги с символическими ссылками
  • 2 Solutions collect form web for “Symial aliasing файлы в подкаталогах без изменения текущего каталога”

    Но что-то о синтаксисе вызывает недоумение и противоречит тому, что я ожидаю.

    Аргументы для ln в том виде, в котором вы его используете, следующие:

    ln [OPTION] … [-T] TARGET LINK_NAME (1-я форма)

    Удивительная, неинтуитивная вещь заключается в том, что при создании символической ссылки целевым аргументом для ln не считается путь к файлу, а скорее содержимое создаваемой символической ссылки. Если вы подумаете об этом на мгновение, очевидно, что это должно быть так. Рассматривать:

     $ echo foo >foo $ ln -s foo bar1 $ ln -s $PWD/foo bar2 $ cat bar1 foo $ cat bar2 foo $ ls -l bar1 bar2 lrwxrwxrwx 1 matt matt 3 Dec 29 16:29 bar1 -> foo lrwxrwxrwx 1 matt matt 29 Dec 29 16:29 bar2 -> /home/matt/testdir/foo 

    В этом примере я создаю две символические ссылки с именем «bar1» и «bar2», которые указывают на один и тот же файл. ls показывает, что сами символические ссылки имеют различное содержимое, хотя – один содержит абсолютный путь, а один содержит относительный путь. Из-за этого можно продолжать работать, даже если он перемещен в другой каталог, а другой не будет:

     $ mv bar2 /tmp $ cat /tmp/bar2 foo $ mv bar1 /tmp $ cat /tmp/bar1 cat: /tmp/bar1: No such file or directory 

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

    Если вы хотите создать файл с именем deploy / resources.php, который ссылается на deploy / resources.build.php, вам нужно решить, хотите ли вы создать абсолютную символическую ссылку (которая устойчива к перемещению символической ссылки, но ломается, если мишень перемещается) или относительная символьная ссылка (которая будет продолжать работать до тех пор, пока обе символическая ссылка и цель перемещаются вместе и сохраняют одни и те же относительные пути).

    Чтобы создать абсолютную символическую ссылку, вы можете:

     $ ln -s $PWD/deploy/resources.build.php deploy/resources.php 

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

     $ ln -s resources.build.php deploy/resources.php 

    Если они не находятся в одном каталоге, вам нужно будет сделать что-то вроде:

     $ ln -s ../foo/f bar/b 

    В этом случае, даже если foo и bar находятся в вашем текущем каталоге, вам нужно включить ../ в цель ln потому что он описывает, как найти f из каталога, содержащего b .

    Это очень длинное объяснение, но, надеюсь, это поможет вам лучше понять синтаксис ln .

    Вы можете создать ссылку в подоболочке следующим образом:

      (cd deploy && ln -s resources.build.php resources.php && cat resources.php) 

    Когда конец подоболочки завершится, вы окажетесь в правильном каталоге.

    Кроме того, вы можете попробовать

      ln -s resources.build.php deploy/resources.php 

    который также работает, пренебрегая включением в CL того факта, что файл resources.build.php отсутствует в каталоге, в котором вы выдаете команду, но на самом деле находится внутри ./deploy .

    Interesting Posts

    Как переместить загрузчик с жесткого диска на USB-накопитель

    Bash, если условия переменных в пределах интервалов

    Как устранить неполадки при переключении макета, когда он «блокируется» на определенном макете?

    Быстрое переключение между сеансами экрана

    Системное событие на вставке адаптера переменного тока или батарее отключено?

    Назначение команды переменной без псевдонима

    Есть ли какие-либо объективные преимущества для escape-последовательностей по сравнению с tput?

    Запретить запуск процессов автоматически

    Nix: Пропуск единичных тестов при установке пакета Haskell

    Ubuntu 16.10 показывает ошибку после загрузки: «Извините, Ubuntu 16.10 испытал внутреннюю ошибку»

    Как отключить удаленный доступ в дистрибутиве Linux?

    Превращение стандартного вывода в одну команду

    собственный файл журнала smartd в системе systemd + journald

    Не удается получить доступ к веб-странице из локальной сети

    mount -a блокирует мой скрипт, если какой-либо из многих удаленных дисков отключен

    Linux и Unix - лучшая ОС в мире.