Як ввести каталог, назва якого лише мінус?


26

Я завантажив менше на свій веб-сервер і розпакував його.

Він містить папку з назвою -. Я припускав, що знаю, як з цим боротися, але не знаю.

Я намагався cd -- -, але це не дає бажаного ефекту. Використання лапок теж не впливає на це. Я кладу косою рису всюди, безрезультатно.

Який правильний спосіб змінити цю папку?

Відповіді:


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 does).


Це дує мій розум, я насправді намагався cd -- -/, але через те, що запустив еквівалент cd -прямо до цього, каталогу насправді не існувало, і я трактував його як чергову невдалу спробу.
Der Hochstapler

5

Кваліфікація за допомогою шляху є одним із варіантів.

cd ./-

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.