Как я могу следить и полностью сообщать о цепочке символических ссылок? - PullRequest
3 голосов
/ 17 марта 2009

Каковы лучшие инструменты / методы программирования для выполнения сложного вложения символических ссылок и полного захвата и создания отчетов по каждой символической ссылке по пути, в том числе в середине пути (дополнительную информацию см. Ниже) 1002 *.

Вот конкретный пример. Рассмотрим следующий вывод команды shell

 ls -l /Library/Java/Home
 lrwxr-xr-x  1 root  admin  48 Feb 24 12:58 /Library/Java/Home -> /System/Library/Frameworks/JavaVM.framework/Home

Команда ls сообщает вам, что файл file / Library / Java / Home является символической ссылкой на другое место. Тем не менее, это не дает вам понять, что то, на что он указывает, также является символической ссылкой

ls -l /System/Library/Frameworks/JavaVM.framework/Home
lrwxr-xr-x  1 root  wheel  24 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Home -> Versions/CurrentJDK/Home

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

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
lrwxr-xr-x  1 root  wheel  3 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK -> 1.5

Что, просто для завершения этой истории, является еще одной символической ссылкой

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/1.5
lrwxr-xr-x  1 root  wheel  5 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Versions/1.5 -> 1.5.0

Наконец указав на «настоящую» папку.

Существуют ли какие-либо инструменты, которые могут каким-то образом визуализировать для вас полную цепочку ссылок (графически или в виде старого текста)? Я уверен, что можно написать это самим (и если вы хотите, пожалуйста, сделайте это и поделитесь!), Но это похоже на то, что было бы чревато "о, дерьмо, крайний случай. крайний случай ". Я надеюсь, что кто-то уже ушел в беспокойство.

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

Ответы [ 5 ]

1 голос
/ 18 марта 2009

Вот скрипт bash, который я недавно собрал, чтобы сделать именно это. Он находит «>» в ​​выводе ls, который указывает символическую ссылку для обхода ссылок. Я не могу ручаться за идеальное поведение в крайних случаях (например, трудно следовать после десяти ссылок, чтобы избежать циклов), но у меня это хорошо работает.

#!/bin/bash 

function deref() {

    FILE="${1%/}"
    COUNT=0
    while [ -L "$FILE" ]; do
        TARGET=`ls -l "$FILE" | sed -e 's/^.*> //'`
        [ ${TARGET:0:1} == "/" ] || TARGET="`dirname $FILE`/$TARGET"

        # strip trailing slashes; -L cannot handle those
        FILE="${TARGET%/}"

        COUNT=$(( COUNT + 1 ))
        [ $COUNT -eq 10 ] && exit 1
    done
    echo $FILE

}

deref "$1"
1 голос
/ 18 марта 2009

Tcl имеет команду [тип файла $ filename], которая возвращает ссылку, если это ссылка. У него есть другая команда [file link $ filename], которая возвращает то, на что указывает ссылка. С помощью этих двух команд можно взять ссылку и переходить по ссылкам, пока не дойдете до реального файла.

Возможно, что-то вроде этого с моей головы:

#!/usr/bin/tclsh

proc dereferenceLink {path {tree {}}} {
    if {[file type $path] == "link"} {
        set pointsTo [file link $path]
        if {[lsearch -exact $tree $path] >= 0} {
            lappend tree $path
            return "[join $tree ->] (circular reference)"
        } else {
            lappend tree $path
            return [dereferenceLink $pointsTo $tree]
        }
    } else {
        lappend tree $path
        return [join $tree "->"]
    }
}

puts [dereferenceLink [lindex $argv 0]]

Вы получите вывод, похожий на:

foo-> бар-> Баз

Если есть круговая ссылка, она будет выглядеть так:

foo-> bar-> baz-> foo (круговой ссылка)

1 голос
/ 18 марта 2009

Этот скрипт Python сделает это, если вы добавите один print внутри цикла:

http://mail.python.org/pipermail/python-ideas/2007-December/001254.html

0 голосов
/ 18 марта 2009

В PHP вы можете использовать is_link и readlink.

Пример использования:

function dereference_link($path) {
  $parts = array();
  foreach (explode(DIRECTORY_SEPARATOR, $path) as $part) {
    $parts[] = $part;
    $partial = implode(DIRECTORY_SEPARATOR, $parts);
    if (is_link($partial)) {
      $result = dereference_link(readlink($partial) . substr($path, strlen($partial)));
      array_unshift($result, $path);
      return $result;
    }
  }
  return array($path);
}
0 голосов
/ 17 марта 2009

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

...