Как проверить, что цель символической ссылки указывает на определенный путь


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и значение $pathIS /some/link, то тексты будут не совпадать.

Многие версии readlinkподдерживают опцию -f, которая канонизирует путь путем расширения всех символических ссылок.

Многие оболочки, в том числе dash, 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.