Символическая ссылка для изменения каталога работает только из домашнего каталога

В обеих оболочках, bash и zsh , утилита [ является встроенной оболочкой. Это реализация этого инструмента в оболочке, она используется вместо двоичного файла / usr / bin / [. Различные результаты, с которыми вы сталкиваетесь, вызваны разными реализациями.


В bash утилита [ принимает УСЛОВНЫЕ ВЫРАЖЕНИЯ как составную команду [[]. Согласно странице руководства bashs допустимы как = , так и == :

string1 == string2
string1 = string2
        True if the strings are equal.  = should be used with the test command for POSIX
        conformance.

В zsh утилита [ пытается реализовать POSIX и его расширения, если они указаны. В спецификации тестовой утилиты POSIX не определен оператор == .

5
13.04.2017, 15:36
2 ответа

Поскольку вы используете Bash в качестве оболочки, вы можете использовать переменную оболочки CDPATH . В руководстве Bash это описывается как

путь поиска: каждое имя каталога в CDPATH ищется для каталога с альтернативными именами каталогов в CDPATH, разделенными двоеточием (':')

Вы можете добавить следующую строку в свой .bashrc :

CDPATH=".:$HOME"

Если вы позже наберете cd dev , в текущем рабочем каталоге будет производиться поиск подкаталога с именем dev :

  • Если такой каталог существует, он переходит в этот каталог (как обычно работает встроенная команда cd ).
  • Если нет, он затем выполнит поиск в вашем домашнем каталоге ( ~ ), найдет символическую ссылку (поймет, что это ссылка на каталог) и перейдет в целевой каталог (на который указывает ~ / dev ).

Если вы хотите отдать предпочтение каталогам в вашем домашнем каталоге, вы можете сначала указать $ HOME в своем CDPATH ( «$ HOME:.» ]), но я настоятельно не рекомендую этого делать, поскольку это нарушает принцип наименьшего удивления : результирующее поведение слишком сильно отличается от стандартного.

11
27.01.2020, 20:31

Вы не можете. Как ты мог? Команда ln создает файл, который является ссылкой на другой файл (или каталог, или что-то еще). Затем вы можете использовать ссылку, как если бы это был оригинал. Но это все еще просто файл. У него есть определенный путь, он не просто волшебным образом плавает и доступен из любой точки файловой системы. Как и в случае с любым другим файлом, вы не можете просто назвать его по имени, вам нужно использовать его путь.

Как если бы вы создали обычный файл:

$ cd ~/foo
$ touch file
$ cd ~/
$ ls file
ls: cannot access 'file': No such file or directory
$ ls ~/foo/file
file

Ссылка ничем не отличается. Вы не можете просто cd cd dev из случайного каталога и ожидать, что он заработает, точно так же, как вы не можете создать cat file в случайном каталоге и ожидать, что система волшебным образом узнает какой файл вы хотите.

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

dev(){
    cd "$HOME"/dev
}

Или просто:

alias dev='cd ~/dev'

Теперь, запустив dev , вы перейдете к ~ / dev . В качестве альтернативы, определите переменную в вашем ~ / bashrc или ~ / .profile :

dev="$HOME/dev"

Теперь вы можете запустить cd $ dev и попасть в ] ~ / dev . Это возможно разными способами, но ссылки не актуальны.

9
27.01.2020, 20:31

Теги

Похожие вопросы