Как определить, на какой каталог указывает ссылка, используя bash - PullRequest
0 голосов
/ 26 августа 2010

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

Например, скажем, у меня есть два следующих каталога:

/var/data/1/ и /var/data/2/

У меня есть ссылка на одну из них, скажем, data_link, и она в настоящее время связана с /var/data/1/

Когда скрипт запускается, я хочу, чтобы он поменял ссылку на /var/data/2/ (т.е. ln -s /var/data/2/ /somepath/data_link).

Когда сценарий будет запущен снова, произойдет обратное (т. Е. ln -s /var/data/1/ /somepath/data_link) и т. Д. Какой самый простой способ сделать это через скрипт Bash?

Ответы [ 2 ]

4 голосов
/ 27 августа 2010

К сожалению, стандартный набор утилит unix не включает простой доступ к системному вызову readlink. Некоторые системы включают команду readlink. Если он доступен, есть большая вероятность, что readlink foo напечатает цель символической ссылки foo. Если вы испытываете желание использовать параметры, имейте в виду, что существует множество версий этой команды; вы не получите переносимость даже между дистрибутивами Linux.

Если у вас есть доступный perl, perl -e 'print readlink $ARGV[0]' mylink печатает цель mylink.

Если вам нужен переносимый способ и у вас нет Perl или чего-либо еще вменяемого, вы, возможно, можете обойтись при разборе вывода ls -l mylink.

Если у вас есть символическая ссылка на каталог, в который у вас есть разрешение на изменение, то $(cd mylink && command -p pwd) - это абсолютный путь к конечной цели ссылки. Например, если foo является символической ссылкой на /var/tmp/bar, bar является каталогом в /var/tmp и /var/tmp является символической ссылкой на /tmp, эта команда выдает /tmp/bar.

1 голос
/ 26 августа 2010

Используйте команду readlink для получения содержимого ссылки:

$TARGET=$(readlink "$LINK")

Затем используйте стандартный if для проверки текущего значения, rm для его удаления и ln, как вы указали, для повторного создания с новой требуемой целью.

...