방금 다음 문제가 발생했습니다.유닉스 프로그래밍 환경, Kernighan과 Pike의 Unix 고전 책(1984년판 ISBN: 0-13-937699-2의 79페이지에서 다음 텍스트를 찾았습니다):
연습 3-6.(트릭 질문) 파일 이름에 /를 어떻게 넣나요(예: 경로 구성 요소를 구분하지 않고 /를 사용합니까?)
나는 최종 사용자이자 프로그래머로서 수년간 Linux를 사용해왔지만 이 질문에 답할 수 없습니다. 가지다절대파일 이름에 슬래시를 추가하는 것은 커널에서 엄격히 금지됩니다. 블록 장치 액세스로 파일 시스템을 패치하거나 유니코드에서 유사한 문자를 사용할 수 있지만 이는 해결책이 아닙니다.
저는 Linux ≠ Unix를 알고 있지만 시스템이 경로에서 명시적으로 디렉터리 계층 구조를 추출할 수 있어야 하므로 동일한 원칙이 적용되어야 합니다.
Kernigan과 Pike가 이 질문을 할 때 무슨 생각을 했는지 아는 사람이 있나요? 대답은 무엇이어야합니까? '트릭'이란 정확히 무엇입니까? 아니면 원래 Unix 시스템에서는 어떻게든 슬래시를 이스케이프 처리할 수 있었을까요?
고쳐 쓰다:
이 문제에 대해 Brian Kernighan에게 연락했는데 그의 답변은 다음과 같습니다.
대답은 "당신은 할 수 없습니다"입니다.
그래서 Timothy Martin이 옳았고 녹색 진드기를 얻었습니다.
답변1
아마도 대답은 다음과 같은 곤란한 질문에 대한 대답의 일부일 것입니다.
코끼리에서 내리는 방법은 무엇입니까? 넌 몰라. 거위에게서 얻습니다.
Brian W. Kernighan과 Rob Pike의 프로그래밍 실습(1장 6페이지)에서 발췌. 158:
Steve Bourne이 Unix 쉘(나중에 Bourne 쉘로 알려짐)을 작성할 때 "\0" 및 슬래시를 제외하고 바이트당 한 문자 값으로 단일 문자 이름을 가진 254개의 파일이 포함된 디렉토리를 만들었습니다. 유닉스 파일 이름.
답변2
나는 이것을했다. 이것은 1980년경 PDP-11에서 실행되는 UNIX 시스템에서 발생했습니다. "WhatXNow?"라는 파일을 만들었습니다. 그런 다음 바이너리 파일 "editor"를 사용하여 디스크 장치를 편집하고 inode의 "X"를 "/"(파일 시스템이 마운트되지 않음)로 변경했습니다.
피해자는 그것을 제거하는 방법을 전혀 모릅니다.
편집: 이런, Bamar의 말이 맞습니다. 장치를 패치하지 않는다는 내용은 거기에 표시되지 않았습니다. 예, 제가 편집하고 있는 디렉토리는 inode가 아니라 디렉토리입니다. 꽤됐다 :-)
답변3
모든 시나리오 /
(보다 정확하게는 문자가 아닌 바이트 - 값이 0x2f; 거의 모든 Unix 커널은 의도적으로 문자 인코딩을 무시함)는 원시 디스크 블록을 수동으로 조작하지 않고 디렉토리 항목으로 들어가는 길을 찾습니다. 커널의 버그는 의심할 여지가 없습니다.
이런 실수는 가끔 일어납니다. 패치 노트를 읽었던 기억이 나는 한 가지 사례는 1990년대에... Solaris라고 말하고 싶지만 아마도 틀렸을 것입니다... 클래식 MacOS와 동등한 AFP(AppleTalk File Protocol)용 서버를 제공했다는 것입니다. 문제는 클래식 MacOS에서는 /
디렉토리 구분 기호 대신 경로 이름 구성 요소를 넣을 수 있다는 것입니다 :
. AFP 서버는~해야 한다도덕적으로 동등한 것은 tr :/ /:
클라이언트가 제출한 경로 이름을 디스크의 파일에 매핑하는 것이지만 몇 가지 코드 경로가 누락되고 서버가 커널 내부에 구현되기 때문에 실제로 잘못된 디렉토리 항목을 작성할 수 있습니다.
(바라보다comp.unix FAQ #2.2, 위의 더 긴 버전에 대해 "파일 이름에 '/'가 포함되어 있으면 어떻게 되나요?"로 시작하는 섹션입니다. )