В одном из кратких руководств, за которым я следовал, cd .
он бесполезен. При попытке воспроизвести проблему, показанную OP в рекурсии символьной ссылки, что делает ее «перезагрузкой»? Я также попробовал cd .
, который показал тот же эффект, который описал OP (растущая $PWD
переменная), с которым можно бороться cd -P
.
Это заставляет меня задуматься, есть ли случай, когда кто-то действительно хотел бы использовать cd .
?
cd-command
Сергей Колодяжный
источник
источник
cd .
для запуска этих проверок, потому что она короткая и простая. Хотя я думаю, что вы хотели, чтобы вопрос был для ванильной среды.$PWD
,cd .
также вносятся изменения$OLDPWD
в текущий каталог. Я (в настоящее время) понятия не имею, почему это может быть полезно, но ради полноты ...cd .
, хотя, видя ответы ниже, я мог бы в будущем, но я иногда использовал,pushd .
когда я хотел быть в состоянииpopd
вернуться в этот каталог позже. например, при запуске сценария сборки, который делаетconfigure
,cd output...
иmake
, и когда это будет сделано, я хочу вернуться к исходному каталогу. Вместо того, чтобы поддерживать свою собственную копию buildscript, которая отличается от того, что ожидают все остальные, я просто запускаю ее какpushd .; ./BuildScriptName.sh; popd
, и это также дает мне свободу неpopd
иногда, а потомpopd
позже./bin/cd
здесь unix.stackexchange.com/q/50058/85039Ответы:
Я думаю, что это переосмысление проблемы.
cd .
может быть не то, что можно было бы запустить вручную в обычном порядке, но это определенно то, что может возникнуть при программном выполнении (подумайте о любой ситуации, когда вы можетеcd
обратиться к каталогу, содержащему файл, путь которого указан пользователем ). Следовательно, он не должен иметь какое-то конкретное применение: пока он выполняет обычную семантикуcd <some-path>
, он полезен.источник
.
должен рассматриваться как допустимый путь, указанныйcd
синтаксисом просто отлично.IFS= read Dir; do cd "$Dir"; do_something; done < <(find . -type d)
. Во время его выполнения поиск производит.
как путь, так что командаcd "$Dir"
расширяется доcd .
. Так что в скриптах это совершенно полезно.cd ${path_to_directory}
, но в какой-то момент оказывается, что каталог является текущим каталогом, иpath_to_directory = .
поэтому вам придетсяcd .
работать на всякий случай.if
проверки иelse
предложения, любой вид специального регистра).Путь к каталогу мог измениться с тех пор, как была выполнена последняя команда, и без
cd .
оболочек bash и ksh93 будет полагаться на логический рабочий каталог, описанный в сообщении, связанном с вопросом, поэтому вызов, вызывающийcd .
проблему сgetcwd()
оболочкой, обеспечит системный вызов. текущий путь все еще действителен.Шаги для воспроизведения в Bash:
mkdir ./dir_no_1; cd ./dir_no_1
mv dir_no_1 dir_no_2
echo $PWD
иpwd
. Обратите внимание, что каталог был переименован извне; среда оболочки не была обновлена.cd .; pwd; echo $PWD
. Обратите внимание, что значение было обновлено.ksh93, однако, не обновляет информацию об окружающей среде, поэтому
cd .
в ksh93 может фактически оказаться бесполезным. В/bin/dash
Ubuntu и других системах на основе Debiancd .
возвращаетdash: 3: cd: can't cd to .
ошибку, однакоcd -P .
работает (в отличие от ksh93).источник
mv ../dir_no_1 ../dir_no_2
в том же терминале / Bash.pwd
фактически является встроенным, однако вызов/bin/pwd
не влияет на среду оболочки - внешние утилиты в целом не влияют на среду оболочки. Причина/bin/cd
и/bin/pwd
существует, среди прочего, для соответствия POSIX. Там очень хорошая дискуссия о внешнем диске , некоторые из которых , вероятно , относится и к/bin/pwd
аДругой вариант
cd .
использования: когда каталог, в котором вы сейчас находитесь, был удален, а затем снова создан. Попробуйте попробовать следующее -temp
cd temp
а затем сделатьls
temp
ls: cannot open directory .: Stale file handle
cd .
а затем делает ls работает нормальноисточник
cd: can't cd to .
Теперь, когда я смотрю на это, это уже упоминалось в ответе Сергея (перемещение, удаление / воссоздание - по сути, то же самое: каталог, в котором вы находитесь, больше не является тем, что был в оригинале путь)cd .
команду, чтобы перейти в новый каталог с тем же именем.cd .
все время, когда у меня есть оболочка, текущий рабочий каталог которой был смонтирован с помощью sshfs, но сессия ssh была закрыта и снова открыта.PWD
переменной среды), затем пройти иерархию файловой системы от корня до каталога, который оказывается доступным через этот путь, будь то на самом деле тот же каталог или нет. Это точно соответствует случаю использования в этом ответе.cd .
работает, когда каталог не связан, и новый каталог создается по тому же пути файловой системы. Текущий рабочий каталог был не связан, и, по-видимому, как часть этого, у него больше нет записи.
или..
, и даже если он есть,.
запись должна продолжать указывать на себя. Похоже, что оболочка или ядро выполняет команду cd, основываясь на том, какое имя пути к каталогу было, а не просто на доступе к.
записи. Кто-нибудь может подтвердить это поведение?Вы можете
$OLDPWD
быстро очиститьcd .
, если должен быть случай, когда вы не хотите, чтобы это указывало на что-то «интересное». Это также повлияетcd -
.источник
Программно это полезно как неоперативный. Рассмотрим путь, предоставленный внешним вводом.
С путем , такими как «fred.txt» каталог будет
.
, что приведет кcd .
источник
dirname
генерирует,.
где это необходимо, чтобы избежать взлома кода, который ожидает разбить путь.Это часто случается, если вам приходилось работать с плохим USB-кабелем. После того, как устройство будет отключено и снова подключено и автоматически подключено к тому же каталогу, вы должны будете снова использовать
cd .
его для работы.источник
Обратите внимание, что "." это правильный способ указать имя файла, который открыт как текущий рабочий каталог любого процесса (включая, конечно, процесс оболочки), и "." всегда является допустимым именем файла во всех без исключения каталогах, включая текущий рабочий каталог. Имя
.
может не являться допустимым именем для файла для данного экземпляра процесса, если, скажем, текущий текущий рабочий каталог был удален (или стал «плохим», например устаревший дескриптор NFS), но это допустимое имя файла, который гарантированно существует в каждом допустимом каталоге.Таким образом,
.
должен быть действительный аргумент для любой команды, которая принимает имя каталога, и, следовательно, в стандартной оболочкеcd .
должна быть допустимая команда.Является ли
cd .
это полезно или нет , зависит от реализации оболочки. Как уже упоминалось, это может быть полезно, если оболочка сбрасывает свое внутреннее представление о полном пути к текущему рабочему каталогу после вызова базовогоchdir
системного вызова, например, если базовый каталог (или некоторый его родитель) был переименован.По крайней мере , некоторые оболочки которых я знаю (
/bin/sh
на FreeBSD и NetBSD) будет конвертироватьcd ""
вcd .
, который , возможно , может быть описана функцией поддержки программного использования в сценарии оболочки , где переменный может быть использован в качестве параметра (т.е. преобразование пустой подстановки переменной в " «ничего не делать»), хотя история коммитов FreeBSD гласит, что изменение было напрямую связано с добавлением поддержки POSIX для предотвращения сбояchdir("")
, который должен произойти из-за мандатов POSIX.Некоторые другие оболочки заменят
.
все, что они сохранили, как полное имя пути к своему текущему рабочему каталогу, и, таким образом, для них это может позволить поведение, упомянутое в ответе Сахила Агарвала .источник
Я использовал эту команду только сегодня, когда перебазировал ветку, над которой я работал, в Git из каталога, который был сначала создан в этой же ветке. Ребаз прошел нормально но потом
git status
выкинул ошибку. Послеcd .
все было нормально.(Кстати, я работал в MobaXterm на Windows. На всякий случай, если вы пытаетесь воспроизвести это. Это может не произойти в других системах.)
Я также использовал эту команду в каталогах, которые обновляются автоматическим процессом, который перемещает в сторону старый каталог и заменяет его новым (поэтому он максимально приближен к атомарному). Не обычная ситуация, но
cd .
это именно то, что нужно.Прочитав этот отличный ответ от Стефана Шазеля:
Теперь я понимаю, что приведенные выше варианты использования работают только потому, что я использую
bash
, чтоcd .
эквивалентноcd "$PWD"
. Я настоятельно рекомендую прочитать связанный ответ.источник
Я использую,
cd .
чтобы перезапустить материал, которым я перегруженcd
черезbash
функцию.Из моего
~/.bashrc
:источник
РЕДАКТИРОВАТЬ: Это уже было предложено Sahil ранее.
Это полезно, если вы находитесь в папке, которая была удалена и воссоздана другим процессом. Например, предполагая два терминальных сеанса
$1
и$2
:Я не уверен, где именно (OS, SHELL, ...?) Коренная причина этого поведения.
источник
Нет, это не имеет смысла. Ни в сценарии, он просто ничего не делает.
источник
$PWD
и, возможно, вызовет другие функции оболочки, если пользователь предоставит свою собственнуюcd
функцию или псевдоним для перегрузки встроенногоcd
. Это также проверило бы, что текущий каталог все еще действителен и что текущее использование имеет разрешение быть там.cd .
будет жаловаться.