
Я игрался в оболочке и набрал ./. Вывод получился следующий:
bash: ./: Is a directory
Похоже, что "./" проверяет, существует ли каталог с указанным именем. Я пытался найти документацию по этому вопросу, чтобы убедиться, что я правильно понял, но не могу найти ничего в сети. Может ли кто-нибудь объяснить мне это?
решение1
Общее определение этого термина, скорее всего, не будет найдено в руководстве Bash, носпецификация POSIX(раздел Разрешение имени пути):
Специальная точка в имени файла должна ссылаться на каталог, указанный его предшественником.
Ну, а что такое предшественник, если у нас есть только .
? Я подчеркнул важную часть:
Если имя пути не начинается с косой черты, то предшественником первого имени файла в имени пути будет считатьсятекущий рабочий каталогпроцесса
Также,
Имя пути, которое содержит хотя бы один символ, отличный от косой черты, и заканчивается одним или несколькими завершающими слешами, должно быть разрешено так, как если бы к имени пути был добавлен один символ точки ('.').
Итак, когда вы вводите, ./
он разрешается как ./.
, что в основном указывает на ваш текущий рабочий каталог. Когда вы вводите что-то в своей оболочке и нажимаете Enter, оболочка попытается выполнить первую часть как команду. (В основном первую группу символов до первого пробела.)
Нет команды или исполняемого файла с именем ./.
, поэтому он потерпит неудачу и сообщит вам, что ./
«является каталогом». Интересно,.
являетсякоманда (она встроенная, также встречается как source
), поэтому, если вы просто введете ее, .
то получите: bash: .: filename argument required
.
решение2
Как писали другие, ./
это имя текущего каталога. Когда вы набрали ./
в приглашении bash и нажали Enter, вы попытались выполнить текущий каталог как команду, что, конечно, не удалось, и bash выдал вам сообщение (перефразированное): "Я не могу этого сделать. ./
это каталог, а я не могу выполнять каталоги как команды".
решение3
Подразумевает .
текущий каталог. Вы используете ./
как префикс для любых файлов в текущем каталоге.
Аналогично, ..
подразумевает предыдущий (вышестоящий) каталог. Часто используется при переходе в каталог более высокого уровня, напримерcd ../../../
Дана файловая система с содержимым:
# Comments start with a hash and aren't parsed
/ # root directory
/foo/ # first level directory
/foo/bar/ # second level directory
/foo/bar/baz # third level directory
/foo/bar/baz/qux # a file in the third level directory
Если вы находитесь в директоре третьего уровня (baz) и запустите ls
, вы увидите qux
. Если вы запустите ls .
, вы получите тот же вывод, что и если вы запустите ls ./
.
Если вы находитесь в директории третьего уровня (baz), и вы запускаете ls ..
и ls ../
оба даете вам baz
. То есть содержимое директории на один уровень выше.
решение4
В Linux ./ означает текущий каталог (а ../ относится к родительскому каталогу).
Если вы выполните команду ls -a, то увидите . и .. в списке каталогов (вам нужен параметр -a, поскольку . представляет скрытый каталог)