모든 디렉토리에 ".." 점이 있는 이유는 무엇입니까? [복사]

모든 디렉토리에 ".." 점이 있는 이유는 무엇입니까? [복사]

역사적인 질문입니다. 나는 이 질문에 대한 답을 찾으려고 노력했지만 운이 없었습니다.

모든 디렉토리에는 "." 및 ".."이 포함되어 있으며 ROOT(/)에도 ".."가 포함되어 있습니다. 그런데 왜 그럴까요? 내 제한된 관점에서는 둘 다 불필요해 보입니다.

  1. 현재 디렉터리에서 스크립트를 실행합니다 ./script.sh. 하지만 "."이 존재하지 않으면 bash script.sh.

  2. 상위 디렉토리로 변경합니다 cd ... 하지만 ".."이 존재하지 않는다면 cd --parent 1(상위 디렉터리로 이동) 과 같은 명령이 있을 수 있을 것 같습니다.

따라서 점과 점은 필수가 아니라 속기인 것 같습니다.

단점은 "."라는 이름의 파일이 생성되지 않는다는 것입니다. 또는"..". 또한 점으로 시작하는 파일을 나열/조작하는 것이 더 어렵고 오류가 발생하기 쉽습니다.

rm -r .* # delete current and parent directory?

분명히 말씀드리자면 저는 변화를 요구하는 것이 아닙니다. 우리가 어떻게 여기까지 오게 됐는지 궁금해요. 이 두 디렉토리를 참조하는 다른 방법이 아닌 왜 이 선택이 이루어졌습니까?

편집: 일부 사람들은 개선 방법에 대한 피드백을 제공하지 않고 내 질문에 투표했습니다.

답변1

.디렉토리는 ..POSIX 유닉스 사양의 일부입니다.

명령 없이도 작동하도록 명령을 변경하라는 귀하의 제안은 상황을 더 복잡하게 만들 것입니다. 역사적인 이유도 있습니다.

.현재 디렉터리를 참조 할 필요가 없다면 어떻게 하시겠습니까? 어쩌면 빈 문자열이 있을까요? 상위 디렉토리를 사용하는 ..것은 지름길처럼 보이지만 이를 사용하지 않기 위해 시스템의 모든 명령에 옵션을 추가하는 것도 좋은 해결책이 아닙니다. 일부(역사적) 시스템은 ...두 상위 디렉토리를 모두 참조해야 하지만 이는 단지 셸 바로가기일 수 있습니다.

디렉토리 ..는 상대 경로 이름에 유용합니다. 이는 콘텐츠를 이식 가능하게 만드는 좋은 방법이며 전체 경로 이름을 하드코딩하는 것보다 더 나은 경우가 많습니다.

일반적으로 이 .디렉터리 는 $PATH. cd따라서 기본 경로에서 제거되었으며 이제 현재 디렉터리에서 무언가를 실행하려면 ./command; bash command대신 사용하면 하나가 아닌 두 개의 프로세스가 시작된다고 명시적으로 수행해야 합니다.

답변2

현재 디렉터리에서 스크립트를 실행합니다 ./script.sh. 하지만 "."이 존재하지 않으면 bash script.sh.

예, 하지만 올바른 통역사가 무엇인지 알아야 합니다. 어쩌면 누군가 Perl로 다시 작성했지만 호환성을 위해 이름을 유지했거나 이름이 실제로 othertool는 확장자 없이 그대로였을 수도 있습니다 . ./othertool시스템이 hashbang line() 을 통해 문제를 처리하도록 하려면 이를 실행하세요 #!. 또는 프로그램이 바이너리일 수도 있기 때문에 다른 마법의 숫자도 있습니다. 물론 .에 추가할 수도 있습니다 PATH.

하지만 그것은 나중에 생각한 합리화입니다. 왜냐하면 해시뱅 라인은 애초에 존재한 적이 없다고 확신하기 때문입니다(그리고 지금도 POSIX가 아닙니다).

상위 디렉토리로 변경합니다 cd ... 하지만 ".."이 존재하지 않는다면 cd --parent 1(상위 디렉터리로 이동) 과 같은 명령이 있을 수 있을 것 같습니다.

예, 존재할 수도 있습니다. 그러나 이는 상대 경로를 사용하려고 할 때마다 더 어려워진다는 것을 의미합니다. 당신은 그런 일을 할 수 없습니다. 아마도 일부 프로그램에는 yours 와 같은 명령줄 옵션을 통해 또는 와 같이 경로 앞에 붙는 문자열을 통해 mv ../foobar/blah .이를 수행하는 방법이 포함될 수 있습니다 .--parent%up/foobar/blah

마찬가지로, 상대 심볼릭 링크가 트리의 더 높은 수준을 가리키도록 만들 수 없습니다. /foo/bar/link뾰족한 심볼릭 링크는 /foo/other/file상대 참조만 포함하는 것이 아니라 이름을 명시해야 합니다 ../other/file. 이름 변경 시 링크가 끊어지거나 foo이름 변경 시 이러한 심볼릭 링크를 다시 작성하는 메커니즘이 있어야 합니다.

일반적으로 사용되지는 않지만,기준파일 시스템 트리에서 위로 이동하는 방식은 이와 같은 일을 더 일반적으로 만들고 다음과 같은 경우에는 일반적이 더 좋습니다.필요.

더욱이, 파일 시스템이 작동하려면 특정 디렉토리의 상위 디렉토리를 찾는 방법이 필요하며 cd --parent, 간단하고 명확한 구현은 해당 디렉토리와 관련된 다른 모든 디렉토리처럼 특별한 이름을 사용하여 이를 저장하는 것입니다.

.cp /some/where/file.txt .또한 유용하므로 특별한 방법으로 "여기"를 참조 할 필요가 없습니다 . 예를 들어, COPYDOS/Windows의 명령은 기본적으로 현재 디렉터리에서 시작하는 GNU find 및 GNU grep과 같이 -r기본적으로 현재 디렉터리를 대상으로 합니다. 그러나 이는 또한 모든 프로그램이 현재 디렉토리의 특수한 경우를 가져야 함을 의미합니다.


물론 이름이 완전히 다를 수도 있고, 예를 들어 이름이 점으로 시작하는 다른 파일의 생성을 비활성화하는 것도 나쁜 생각이 아닐 수도 있습니다. 또는 이러한 특수 이름에 대해 특정 문자를 예약하고 다른 파일 이름에서 해당 문자의 사용을 완전히 허용하지 마십시오.

관련 정보