Как вы вводите каталог, имя которого только минус?

26

Я загрузил урок на свой веб-сервер и распаковал его.

Он содержит папку с именем -. Я предполагал, что знаю, как справиться с этим, но я не знаю.

Я пытался cd -- -, но это не дает желаемого эффекта. Использование кавычек, похоже, тоже не влияет на это. Я положил косые черты повсюду, но безрезультатно.

Как правильно перейти в эту папку?

Der Hochstapler
источник

Ответы:

34

Вы хотите, чтобы это не было параметром, поэтому мы пытаемся что-то добавить к нему. Доступ к текущему каталогу возможен с помощью ., таким образом, подпапка -может быть доступна альтернативно с помощью ./-.

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

Тамара Вийсман
источник
4
Нет, «-» реализован во всех стандартных утилитах, но предназначен для завершения опций. «-» не распознается как опция, а как предыдущий каталог.
Стефан Шазелас
4
Правильное решение, но объяснение неверно. Это совершенно не имеет значения, что cdявляется встроенным. Причина cd -- -не работает в том, что -это операнд, а не опция.
Жиль "ТАК ... перестать быть злым"
1
в Mac OS X cd -- -изменит вас на каталог с именем -в текущем каталоге. FWIW.
Тим Кеннеди
Большинство комментариев были отражены во второй части моего поста.
Тамара Вийсман
22

Один минус (иначе тире) - это не опция, а операнд (то есть аргумент, который не является опцией). Из-за этого постановка --перед ним не имеет никакого эффекта. Тире является операндом в cd -и все еще операндом в cd -- -. Как и другие стандартные утилиты, cdоперанд обрабатывается как операнд независимо от того, есть ли --перед ним.

Команда cdприсваивает операнду особое значение -. Все остальное - это каталог для переключения. cd -- -aпереключается на каталог с именем -a, потому что -aне является специальным операндом и не --позволяет cdрассматривать его как опцию. Это не работает в -одиночку, что не вариант.

Помещение кавычек -не поможет, так как в конечном итоге это -все равно пропустит операнд .

Поэтому вы можете найти другой способ выразить ту же идею, то есть другое имя для того же каталога. К счастью, есть простое: если вы добавите ./перед относительным именем файла, это все равно означает тот же файл. Значение ./действительно имеет значение, которое не имеет значения в нашем случае: CDPATHне используется, когда имя каталога начинается с /, ./или ../. Таким образом:

cd ./-

Другой способ, поскольку -каталог является добавлением /после него. Добавление /в конце имени файла гарантирует, что файл будет рассматриваться как каталог (в частности, команда будет работать с самим каталогом, а не с символической ссылкой, если файл является символической ссылкой на каталог), но в противном случае делает нет разницы. Таким образом:

cd -- -/

-/Кстати, написание написано в коде завершения, но в bash он --до этого работает только на самом деле , у bash нет особого случая для cd -/(zsh делает).

Жиль "ТАК - перестань быть злым"
источник
Я действительно пытался это взорвать cd -- -/, но из-за запуска эквивалента cd -прямо перед этим, каталог на самом деле не существовал, и я интерпретировал его как еще одну неудачную попытку.
Der Hochstapler
5

Квалификация с путем является одним из вариантов.

cd ./-
Iruvar
источник
2

Это также будет работать:

cd ~/'-'

или

cd ~/"-"
Майкл Даррант
источник
1
но только если это происходит в домашнем каталоге
RiaD
1
... и цитаты не нужны.
Скотт