`cd ..`, `cd .` 및 `cd ...`의 차이점은 무엇입니까? 그들은 무얼 할 수 있니?

`cd ..`, `cd .` 및 `cd ...`의 차이점은 무엇입니까? 그들은 무얼 할 수 있니?

저는 시스템 프로그래밍을 배우는 초보자입니다.

cd ..cd ., , 및 의 사용법을 검색해 봤지만 cd ...알고 보니 cd ..한 디렉토리 뒤로 이동한다는 의미뿐이었습니다.

MacOS의 터미널에서 사용해 보았습니다. 타이핑이 cd ..작동합니다. 그러나 내가 cd ...그것을 입력할 때 그것은 말한다

zsh: command not found: cd...

입력할 때 경로는 변경되지 않습니다 cd ..

이 질문에 대답하도록 도와주세요. 감사합니다.

답변1

디렉토리 ...현재 디렉토리와 상위 디렉토리를 각각 참조하는 특수 디렉토리입니다.

이 명령은 cd디렉터리를 변경합니다. 따라서 cd .특별한 것은 없습니다(당신이 있는 곳으로 가십시오).

모든 UNIX 쉘에서는 명령과 해당 인수를 공백으로 구분해야 하므로 명령이 cd...아니며 cd존재하지 않습니다. 일부 시스템에는 ...두 디렉터리 위로 바로 가기가 있지만 이는 표준이 아니며 내가 알고 있는 현재 시스템에서는 작동하지 않습니다. 그래서 cd...주어질 수도 command not found있고 cd ...주어질 수도 있습니다 no such file or directory.

cd명령은 셸에 내장되어 있으며 해당 설명서는 셸의 매뉴얼 페이지에서 찾을 수 있습니다. 예를 들어, man bash또는man bash-builtins

.및 사용을 포함하여 경로 확인이 작동하는 방식에 대한 자세한 내용은 ..POSIX 표준에서 확인할 수 있습니다 /.man path_resolutionhttps://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13

답변2

파일 경로를 인수로 취하는 시스템 호출에서 .상대 경로는여기, ..그리고상위 디렉토리. ¹ 과 동일하며 some/dir/.의 상위 디렉토리이며, 심볼릭 링크가 아닐 수도 있습니다.some/dirsome/dir/..some/dirsomesome/dir

전통적으로 .및는 해당 디렉토리가 있는 디렉토리, 상위 디렉토리에 대한 ..하드 링크로 구현되며 처음에는 유틸리티에 의해 호출되고 나중에는 시스템에 의해 호출됩니다. 파일 시스템에 따라 여전히 그럴 수도 있고 더 이상 그렇지 않을 수도 있습니다. 이 합계는 /에 의해 반환될 수도 있고 반환되지 않을 수도 있지만 , 이에 관계없이 항상 해결해야 합니다....mkdirmkdir()...readdir()getdents()여기그리고상위 디렉토리파일 경로를 인수로 사용하는 시스템 호출에서.

따라서 이는 파일 경로를 인수로 사용하는 대부분의 명령에도 적용됩니다.

  • vi some/dir/../file편집 중인 file상위 디렉토리의 파일입니다 some/dir( 반드시 와 같을 필요는 없음 some/file).
  • lsls .현재 작업 디렉토리의 내용을 나열하는 약어입니다. 현재 작업 디렉토리에 있는 파일의 세부사항을 나열하는 약어입니다 ls -ld.ls -ld .
  • ls -l ..현재 작업 디렉터리의 상위 디렉터리 내용을 나열합니다.

cd(그리고 그것을 가지고 있는 쉘에서) 대부분의 쉘에서는 자체적으로 구현하기 pushd때문에 예외입니다.cd논리적 디렉터리 탐색.

cd some/dir/..chdir("some/dir/..")( chdir()현재 작업 디렉터리를 변경하기 위한 실제 시스템 호출은 어디에 있습니까?) 실행하지 않고 chdir("some")일부 셸에서 실행합니다(때때로 현재 작업 디렉터리에 대한 경로가 더 이상 존재하지 않는 chdir("$PWD/some")경우에도 마찬가지입니다 ). $PWD그리고 그런 일은 cd ..하지 않습니다 .chdir("..")chdir(dirname($PWD))

즉, 사용자 cd가 놀라는 위험을 최소화하기 위해 심볼릭 링크가 디렉터리로 처리되도록 자체적으로 특별하게 처리됩니다 cd. ..예를 들어, 심볼릭 링크만 있어도 cd some/dir; cd ../..시작한 곳으로 돌아갈 수 있습니다.some/dirsome/somewhere/entirely/different

혼란을 야기할 수 있으므로 이를 기억하는 것이 중요합니다. 예를 들어, vi some/dir/../file다양한 파일을 편집할 수 있습니다.cd some/dir/.. && vi file

다른 명령처럼 처리하려면 cdoption²이 필요합니다. 이것이 스크립트에서 이를 사용하는 것이 종종 권장되는 이유입니다(따라서 이 점에서 쉘로 작성된 프로그램은 다른 언어로 작성된 프로그램과 동일하게 작동합니다)...-Pcd -P

이제는 ...특별한 파일이 아니므로 다른 파일과 동일하게 취급됩니다.

mkdir ... && cd ......(로 시작하기 때문에 숨겨져 있음 ) 이라는 이름의 디렉토리가 .생성되어 해당 디렉토리로 이동됩니다 chdir()( 셸에 따라) chdir("...").chdir("$PWD/...")

cd ......그렇지 않은 경우 존재하지 않는 오류가 반환됩니다 cd any/other/inexistent/directory.

cd...cd와 사이에 공백이 없으면 사용자 환경에 존재하지 않을 수 있는 명령을 ...호출하려고 시도하고 cd...그에 따라 오류를 반환합니다.

이제 입력 시간을 단축하기 위해 일부 사람들은 cd...다음과 같은 별칭을 만들었습니다.

alias cd...='cd ../..'  cd....='cd ../../..'

따라서 호출은 현재 작업 디렉터리의 상위 디렉터리의 상위 디렉터리를 호출 cd...합니다 (cd논리적으로왜냐하면 위와 같이 a)를 수행하는 대신 의 꼬리에서 두 개의 디렉토리 구성 요소를 꺼내기 때문입니다 $PWD.chdir("../..")

zsh또한 있다글로벌별칭은 일반 별칭과 같은 명령 위치뿐만 아니라 어디에서나 확장될 수 있으므로 일부 사람들은 다음과 같이 수행합니다.

alias -g ...=../.. ....=../../..

이는 사전 실행(pre-execution) 또는 실행 전(before-execution)을 의미 cd ...하며 ls ... 변경됩니다 . 그러나 이는 적용되지 않습니다 . 가지다cd ../..ls ../..cd .../dir.사용자 정의 키 바인딩을 사용하여 유사한 기능을 달성하는 더 나은 방법.


1 if some/dir는 기호 링크 이지만 some/dir/.like는 기호 링크가 가리키는 디렉터리를 참조합니다. 이 구별 은 some/dir/기호 링크가 해결된 lstat()lchown()( 예 : .. .).readlink()unlink()open()chown()

² 차단 /처리나 차단(또는 zsh에서는 ...) 특수 처리 -P는 없지만 이는 별도의 질문입니다.$CDPATH$cdpath--1+2

관련 정보