Символическая ссылка и вопросы с жесткой ссылкой

Предположим, что /A/B/c.sh символически связано с /X/Y/c.sh.

  • Если c.sh имеет команду «./SOMETHING», «.» означает / A / B / или / X / Y /?
  • Как насчет жесткой ссылки?

. фактически является текущим рабочим каталогом в любом случае; он не имеет ничего общего с каталогом, в котором находится скрипт:

 [/tmp] $ echo "realpath ." > test.sh && chmod +x test.sh [/tmp] $ /tmp/test.sh /tmp [/tmp] $ cd /usr/bin [/usr/bin] $ /tmp/test.sh /usr/bin 

Я согласен с Майклом, но одно место, где это может иметь значение, – параметр $0 .

Я видел сценарии, которые исследуют имя $0 и делают разные вещи, основываясь на том, какое символическое имя используется.

. в этом случае означает, что текущий работает напрямую; пути ссылок не имеют значения. Ссылка на файл для выполнения или редактирования по существу одинакова независимо от типа ссылки, хотя между ними существует несколько различий .

Хотя это не то, что вы спросили, это может быть то, что вы ищете …

Вы можете использовать "$0" для поиска суб-скриптов, которые находятся в том же каталоге, что и основной скрипт.

 MYPATH="$(realpath "$0")" MYDIR="$(dirname "$MYPATH")" "$MYDIR/otherscript" ... 

Поскольку основной скрипт имеет символическую ссылку, вам нужно сначала realpath $0 , используя realpath . Хотя dirname возвращается . если его аргумент не имеет части каталога, в этом примере realpath уже превратил arg в абсолютный путь.