Действительно ли символьная ссылка является целью относительно родительского каталога места назначения и если так, почему?

Просто удалите ; символ, таким образом, в финале:

 for i in *; do something.py $i & done

И для выполнения N экземпляр Вашего сценария одновременно, посмотрите man 1 parallel

См. http://www.gnu.org/software/parallel/

14
18.12.2013, 15:40
2 ответа

Для того, который не работает, если мы смотрим на ls -l результат, мы получаем следующее:

[sparticvs@sparta test]$ ls -l build/
total 0
lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client

Теперь для понимания, что продолжается здесь. Давайте посмотрим на команду, которую Вы назвали:

ln -s client build/client

Согласно Странице справочника, существует два возможных соответствия для этого формата

SYNOPSIS
       ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
       ln [OPTION]... TARGET... DIRECTORY     (3rd form)

Это будет соответствовать на первой форме (начиная с его первого). Теперь, "цель называют" или client в Вашем случае, может быть (согласно полному ln руководство) произвольные строки. Они не должны решать ни к чему прямо сейчас, но могут решить к чему-то в будущем. То, что Вы создаете со своим вызовом, является "повисшей символьной ссылкой", и система не мешает Вам создавать их.

Теперь Ваш второй вызов ln -s ../client build/client то, что называют "относительной символьной ссылкой" (как Вы отметили в своем собственном сообщении). Существует второй тип, и это - "абсолютная символьная ссылка", которую назвали бы путем выполнения ln -s /home/user/client build/client.

Это не ошибка. Согласно руководству это указывает:

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

- от info coreutils 'ln invocation'

Тем не менее НЕОБХОДИМО использовать или относительный или полный путь для цели.

13
27.01.2020, 19:51

Это - действительно намеченное поведение. От ln(1) страница справочника:

Символьные ссылки могут содержать произвольный текст; если позже разрешенный, относительная ссылка интерпретируется относительно ее родительского каталога.

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

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

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

$ ls -1 /home/you/project
thingummies/
widgets/
wizardry/

Теперь предположите, что Вы хотели создать символьную ссылку на widgets/ внутри wizardry/. У Вас есть две опции:

$ ln -s /home/you/project/widgets /home/you/project/wizardry

или

$ ln -s ../widgets /home/you/project/wizardry

Если Вы затем пытаетесь переместиться /home/you/project где-либо еще символьная ссылка, созданная с первой формой, повредится, потому что она ищет /home/you/project/widgets. Вторая форма сохранит символьную ссылку функциональной, потому что она ищет ../widgets относительно места это находится в, независимо от того, где то место могло бы быть в дереве каталогов.

5
27.01.2020, 19:51

Теги

Похожие вопросы