Вы хотите, чтобы это не было параметром, поэтому мы пытаемся что-то добавить к нему. Доступ к текущему каталогу возможен с помощью .
, таким образом, подпапка -
может быть доступна альтернативно с помощью ./-
.
cd ./-
Причина, по которой cd -- -
это не работает, заключается в том, что это реализовано по-разному, если вы сравниваете rm
(смотрите man rm
) с cd
(видите man bash
или man cd
), имеете cd
другую интерпретацию, которая воспринимается -
как параметр (смотрите man bash
или man cd
).
Также следует отметить, что cd
это встроенная функция оболочки, о чем можно прочитать в этом ответе :
cd
это не внешняя команда - это встроенная функция оболочки. Он запускается в контексте текущей оболочки, а не, как внешние команды, в контексте fork / exec'd как отдельный процесс.
Есть внешняя cd
команда, но она делает что-то совершенно другое .
Это объясняет, почему реализация отличается, поскольку Bash и Coreutils - это две разные вещи.
Давайте просто предположим, что вы не поверите этому, как мы можем это подтвердить? Используйте which
и type
.
$ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
$ which rm && type rm
/bin/rm
/bin/rm is /bin/rm
Смотрите man which
для получения дополнительной информации и man bash
или man type
дляtype
cd
является встроенным. Причинаcd -- -
не работает в том, что-
это операнд, а не опция.cd -- -
изменит вас на каталог с именем-
в текущем каталоге. FWIW.Один минус (иначе тире) - это не опция, а операнд (то есть аргумент, который не является опцией). Из-за этого постановка
--
перед ним не имеет никакого эффекта. Тире является операндом вcd -
и все еще операндом вcd -- -
. Как и другие стандартные утилиты,cd
операнд обрабатывается как операнд независимо от того, есть ли--
перед ним.Команда
cd
присваивает операнду особое значение-
. Все остальное - это каталог для переключения.cd -- -a
переключается на каталог с именем-a
, потому что-a
не является специальным операндом и не--
позволяетcd
рассматривать его как опцию. Это не работает в-
одиночку, что не вариант.Помещение кавычек
-
не поможет, так как в конечном итоге это-
все равно пропустит операнд .Поэтому вы можете найти другой способ выразить ту же идею, то есть другое имя для того же каталога. К счастью, есть простое: если вы добавите
./
перед относительным именем файла, это все равно означает тот же файл. Значение./
действительно имеет значение, которое не имеет значения в нашем случае:CDPATH
не используется, когда имя каталога начинается с/
,./
или../
. Таким образом:Другой способ, поскольку
-
каталог является добавлением/
после него. Добавление/
в конце имени файла гарантирует, что файл будет рассматриваться как каталог (в частности, команда будет работать с самим каталогом, а не с символической ссылкой, если файл является символической ссылкой на каталог), но в противном случае делает нет разницы. Таким образом:-/
Кстати, написание написано в коде завершения, но в bash он--
до этого работает только на самом деле , у bash нет особого случая дляcd -/
(zsh делает).источник
cd -- -/
, но из-за запуска эквивалентаcd -
прямо перед этим, каталог на самом деле не существовал, и я интерпретировал его как еще одну неудачную попытку.Квалификация с путем является одним из вариантов.
источник
Это также будет работать:
или
источник