Разница между «cd -» и «cd ~ -»

Попробуйте использовать утилиту MegaCli для RAID-контроллеров в Linux. Вы можете получить его на сайте LSI. Я не знаю, какая у вас модель RAID-контроллера, и может ли эта утилита ее увидеть.

61
19.12.2016, 00:18
3 ответа

Здесь играют роль две вещи. Во-первых, только - расширяется до вашего предыдущего каталога. Это объясняется в разделе cd документа man bash (выделено мной):

Аргумент - преобразуется в $ OLDPWD перед попыткой смены каталога. Если используется непустое имя каталога из CDPATH, или если - является первым аргументом , и смена каталога прошла успешно, абсолютный путь к новому рабочему каталогу будет записывается в стандартный вывод . Возвращаемое значение - истина, если каталог был успешно изменен; в противном случае - ложь.

Итак, простой cd - вернет вас в предыдущий каталог и распечатает имя каталога. Другая команда описана в разделе «Расширение тильды»:

Если префикс тильды - ~ + , значение переменной оболочки PWD заменяет префикс тильды. Если тильда-префикс представляет собой ~ - , значение переменной оболочки OLDPWD, если оно установлено, заменяется. Если символы, следующие за тильдой в префиксе тильды, состоят из числа N, необязательно с префиксом + или - , то { Префикс тильды {1}} заменяется соответствующим элементом из стека каталогов , так как он будет отображаться встроенным каталогом , вызываемым с префиксом тильды в качестве аргумента. Если символы , следующие за тильдой в префиксе тильды, состоят из числа без начала + или - , + предполагается.

Это может быть легче понять на примере:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

Итак, в общем, - означает «предыдущий каталог». Вот почему cd - сам по себе вернет вас туда, где вы были.

Основное отличие состоит в том, что cd - специфичен для встроенной команды cd . Если вы попытаетесь ввести echo - , он просто напечатает - . ~ - является частью функции раскрытия тильды и ведет себя аналогично переменной. Вот почему вы можете echo ~ - и получить что-то значимое. Вы также можете использовать его в cd ~ - , но вы также можете использовать его в любой другой команде. Например cp ~ - / *. , что эквивалентно cp "$ OLDPWD" / *.

102
27.01.2020, 19:32

TL; DR: cd - встроен в cd , ~ - является более поздним расширением ~ [name] , не специфичен для cd .

POSIX.1-2008 Shell & Utilities определяет cd - как особый случай , специфичный для команды cd :

Когда в качестве операнда используется - , это должно быть эквивалентно команде:

cd "$ OLDPWD" && pwd

, которая переходит в предыдущий рабочий каталог и затем записывает свой имя.

Расширение ~ - будет расширено до $ OLDPWD перед выполнением любой команды и может быть передано в качестве аргумента для любой команды, а не только cd . Это более позднее расширение в и .

Вышеупомянутый стандарт POSIX.1-2008 Shell & Utilities также содержит подробное объяснение расширения тильды . Формулировка очень специфична, чтобы разрешить ~ - как неопределенное поведение в рамках стандарта, где ~ [name] относится к $ HOME if ] [имя] - пустая строка или домашний каталог пользователя имя , если имя является допустимым именем пользователя.

6
27.01.2020, 19:32

~ - подлежит раскрытию тильды (см. Man bash), поэтому cd видит непосредственно предыдущее имя каталога . - не расширяется оболочкой, cd видит его напрямую и ведет себя, как описано в документации:

Аргумент - эквивалентен $ OLDPWD. Если используется непустое имя каталога из CDPATH, или если - является первым аргументом и изменение каталога прошло успешно, в стандартный вывод записывается абсолютный путь к новому рабочему каталогу.

16
27.01.2020, 19:32

Теги

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