Подтвердить что ты не робот

Как проверить, соответствует ли цель symlink конкретному пути?

Я создаю bash script, чтобы проверить, соответствует ли целевой символ symlink определенному пути, поэтому, если он не соответствует, script удаляет символическую ссылку. Я пробовал с readlink:

#!/bin/env bash

target_path=$HOME/Code/slate/.slate.js

if [ `readlink $HOME/.slate.js` == "$target_path" ]; then
    rm -rf "$HOME/.slate.js"
fi

но он не работает:

%source test
test:5: = not found
4b9b3361

Ответ 1

Для сравнения строк следует использовать двойные кавычки (и да, вывод readlink $HOME/.slate.js - это строка):

[ "$(readlink $HOME/.slate.js)" = "$target_path" ]

Ответ 2

В случае, если $target_path не соответствует тексту ссылки, вы можете проверить, что они фактически эквивалентны (независимо от имени). Но так как предпочтительна жесткая ссылка, вы можете также проверить этот случай (см. Ниже).

Более общее решение:

[ "$(readlink $HOME/.slate.js)" -ef "$target_path" ]

Или, как в вашем примере:

target_path=$HOME/Code/slate/.slate.js

if [ "`readlink $HOME/.slate.js`" -ef "$target_path" ]; then
    rm -rf "$HOME/.slate.js"
fi

Но все предполагает, что ваш $HOME/.slate.js является символической ссылкой. Если это жесткая ссылка (что предпочтительнее, когда это возможно), то это проще:

 … [ "$HOME/.slate.js" -ef "$target_path" ] …

Возможно, что-то вроде (проверьте, является ли это символической ссылкой, если да, то проверьте, соответствует ли ссылка целевой, иначе проверьте, являются ли файлы одинаковыми - либо жесткая ссылка, либо фактически тот же файл):

 … [ \( -L "$HOME/.slate.js" -a "`readlink $HOME/.slate.js`" -ef "$target_path" \) \
     -o \( "$HOME/.slate.js" -ef "$target_path" \) ] …

Вы также должны проверить, является ли файл, по сути, одним и тем же файлом (а не жесткой ссылкой), иначе вы удалите одну и только копию.