Intereting Posts
Веб-браузер подключил звук пульсового звука, как выпустить? Блокировка второго указателя мыши и ввода клавиатуры в одно окно Imagemagick имеет проблемы с экранированием переменных оболочки Как удалить дубликаты из выходных данных tshark Как найти файлы на основе массива могу ли я использовать dd для копирования жесткого диска с двойной загрузкой (350G) на меньший SSD (120 ГБ) только с одной из двух ОС с жесткого диска Установите MySQL из Bash Script Linux Mint 18.3 Virtualbox с гостевыми расширениями и уже входящим в vboxusers, не видит USB на машине, но может видеть в настройках Сбой сервера по не столь очевидным причинам Вывод команды захвата в течение n секунд, затем отсоедините ее (запустите в фоновом режиме) Почему mencoder выводит неподвижные изображения, если я пытаюсь закодировать их под 3 FPS, в то время как mencoder выводит динамические изображения, если я выводил их при 3 FPS или более? Как постепенно шифровать выходной файл tshark вдоль захвата? Попробуйте установить Linux с USB, ОС загрузки и перезагрузки компьютера Как заставить yum загружать из определенного зеркала? Многопоточное разделение в системе * nix

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

Команда Bash

cd - 

печатает ранее используемый каталог и изменения к нему.

С другой стороны, команда Bash

 cd ~- 

напрямую изменяется на ранее используемый каталог, не повторяя ничего.

Разве это единственная разница? Каков прецедент для каждой из команд?

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

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

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

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

Это может быть проще понять с помощью примера:

 $ 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 - он просто напечатает a. ~- является частью функциональности расширения тильды и ведет себя аналогично переменной. Вот почему вы можете echo ~- и получить что-то значимое. Вы также можете использовать его в cd ~- но вы можете просто использовать его в любой другой команде. Например, cp ~-/* . который был бы эквивалентен cp "$OLDPWD"/* .

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

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

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

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

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

cd "$OLDPWD" && pwd

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

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

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