Як перевірити ціль символічних посилань на певний шлях


16

У рамках bash-скрипту я знаю, що я можу перевірити, чи файл є символічним посиланням із наступним синтаксисом

if [ -L $path ]

Хтось знає, як я перевірив би, чи був цей шлях пов'язаний з певним шляхом? Наприклад , я хочу , щоб перевірити , є чи об'єкт $pathє /some/where.



2
Ви маєте в виду пов'язані з певним шляху? Не могли б ви зробити readlinkвідомий шлях і порівняти його з тим, який ви тестуєте?
Братчлі

@Bratchley Так, це я мав на увазі .. дякую за відповідь.
BillMan

2
Я настійно закликаю вас завжди вводити змінні оболонки в лапки (наприклад, if [ -L "$path" ]), якщо у вас немає вагомих причин цього не робити, і ви впевнені, що знаєте, що робите.
G-Man каже: "Відновіть Моніку"

@ G-Man дякую за чудові відгуки .. підсвідомо я це знаю, але забудь це на практиці .. підкріплення допомагає.
BillMan

Відповіді:


22

Якщо ви хочете перевірити, чи $pathє символічне посилання, метою якого є /some/where, ви можете скористатися readlinkутилітою. Це не POSIX, але він доступний у багатьох системах (GNU / Linux, BusyBox, * BSD,…).

if [ "$(readlink -- "$path")" = /some/where ]; then 

Зауважте, що це точне порівняння тексту. Якщо цільовим посиланням є ціль /some//where, або якщо це whereі значення $pathє /some/link, тексти не збігаються.

Багато версій readlinkпідтримують варіант -f, який канонізує шлях шляхом розширення всіх символічних посилань.

Багато оболонок, включаючи тире, ksh, bash і zsh, підтримують -efоператора у testвбудованій програмі, щоб перевірити, чи два файли однакові (жорсткі посилання на один і той же файл, після переходу символічних посилань). Ця функція також широко підтримується, але не є POSIX.

if [ "$path" -ef "/some/where" ]; then 

перший приклад не працює, коли посилання вказує на відносний шлях ...
inemanja

1
@inemanja Звичайно, це так. Але, як я констатую, це порівняння тексту . Він розглядає різні шляхи до однієї цілі як різні. Якщо ви хочете перевірити, чи є цільовим символьним посиланням певний файл , а не певний шлях , скористайтеся одним із методів, описаних нижче.
перестань бути злим"

0

Щоб уникнути проблем із відносним та абсолютним шляхом та "/" в кінці шляху чи посилання:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi

1
readlinkне видається необхідним, realpathавтоматично вирішить символічне посилання.
Даган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.