Intereting Posts
Драйверы Realtek предотвращают обнаружение интерфейса eth1? Различия между sudo и su в наследующей среде Клавиатура USB игнорирует нажатия клавиш в некотором очень расстраивающемся шаблоне Отключение монитора как root, без xset Печать строк журнала, исключая ранее повторяющиеся строки? Обновлен с Ubuntu 14.04 до 15.1, и я заканчиваю работу в командной строке при перезагрузке. Что мне теперь делать? Как перерабатывать имена устройств USB в Linux после принудительного удаления Лучше цвета, поэтому комментарии не синие в Vim? Выполнение одной и той же команды с разными аргументами параллельно Как использовать пароль в сценариях оболочки Не могу двойной загрузки ОС Phoenix и Lubuntu Удаленно удалите схему Oracle с помощью сценария оболочки Как изменить файловый менеджер по умолчанию в GNOME 3 (Fedora 23) с установленным LXDE? Как разбирать строку для номера порта в ksh Как возобновить приостановленную оболочку?

Как мне снова и снова сжимать c символическими ссылками в bash?

Состав:

/base/ +- somedir/ +- symlink/ -> /some_other_dir 

Эта команда (в дополнение к моим файлам Makefile) не выполняется:

 cd /base/symlink ls ../somedir 

Баш жалуется, что ../somedir не существует. Аналогично, мои make-файлы в some_other_dir, эта ссылка ../somedir терпит неудачу. Однако cd .. работает так, как ожидалось. Могу ли я заставить свою оболочку действовать в отношении логической структуры?

.. является записью каталога в текущем каталоге. Это жесткая ссылка на каталог на один уровень вверх. /base/symlink/.. на самом деле тот же файл, что и /some_other_dir/.. , и это / (если some_other_dir сам по себе также является символической some_other_dir в другое место).

В большинстве оболочек cd обрабатывает .. специально, то есть вместо того, чтобы рассматривать его как запись в каталоге .. , вхождения .. интерпретируются cd (а не по разрешению пути по системе) как удаление одного уровня каталога.

В качестве примера, в cd a/b/.. , оболочка выполняет chdir("a") вместо выполнения chdir("a/b/..") . Чтобы получить последнее, вам нужно сделать cd -P a/b/..

Важно понимать, что оно применимо только к cd (и только в некоторых оболочках) (IMO, недостоверность), а не к ls или vi или чему-либо еще (если только что- то еще не является скриптом, написанным с этими оболочками).

В тех оболочках, где cd выполняет эту логическую интерпретацию .. , встроенная переменная pwd и переменная $PWD содержат логический текущий каталог вместо реального (физического), то есть один с возможно компонентами каталога ссылок. Аналогично, вы можете использовать pwd -P для получения физического рабочего каталога.

Теперь, если вы хотите сделать

 cd /A/b anything-but-cd ../c 

И на самом деле означает:

 anything-but-cd /A/c 

Независимо от того, была ли ссылка /A/b символической или нет, вы можете сделать следующее:

 anything-but-cd "$(dirname -- "$PWD")/c" 

или

 anything-but-cd "${PWD%/*}/c"