filename — Tcl이 다루는 파일 이름 규칙
filename — Tcl이 다루는 파일 이름 규칙
Tcl로 파일을 다룰 때 가장 먼저 마주치는 것이 파일 이름 표기법이에요. Tcl은 플랫폼마다 서로 다른 형식의 파일 이름을 지원하는데, 익숙해지면 스크립트가 어느 운영체제에서도 비슷하게 동작하도록 만들 수 있어요.
본문
filename은 명령어라기보다 Tcl 전반에서 파일 이름을 다루는 규칙 문서예요. 파일 이름을 인자로 받는 모든 Tcl 명령어와 C 프로시저는 현재 플랫폼에 따라 다음 세 가지 형식 중 하나로 파일 이름을 받아들여요. 각 플랫폼에서 Tcl은 그 플랫폼의 표준 형식을 지원하고, 추가로 모든 플랫폼에서 간단한 파일 이름을 쉽게 만들 수 있도록 Unix 스타일 구문도 지원해요.
다만 이식성 있는 스크립트는 특정 파일 이름 형식을 가정하면 안 돼요. 대신 file split과 file join 명령어로 파일 이름을 조작해야 해요(file 매뉴얼을 참고하세요).
경로의 종류 (PATH TYPES)
파일 이름은 경로가 시작하는 지점에 따라 세 가지로 나뉘어요.
- 절대 경로(absolute) — 완전히 한정된 경로예요. 특정 볼륨과 그 볼륨의 루트 디렉토리를 기준으로 파일을 가리켜요.
- 상대 경로(relative) — 한정되지 않은 경로로, 현재 작업 디렉토리를 기준으로 파일을 가리켜요.
- 볼륨 상대 경로(volume-relative) — 부분적으로만 한정된 경로예요. 현재 볼륨의 루트 디렉토리를 기준으로 하거나, 지정한 볼륨의 현재 디렉토리를 기준으로 해요.
file pathtype 명령어로 주어진 경로가 어떤 종류인지 알아낼 수 있어요.
경로 구문 (PATH SYNTAX)
네이티브 이름을 해석하는 규칙은 tcl_platform 배열의 platform 요소에 따라 달라져요.
Unix — Unix와 Apple macOS에서 Tcl은 경로 구성 요소를 슬래시로 구분해요. 경로는 상대적일 수도 절대적일 수도 있고, 파일 이름에는 슬래시를 제외한 어떤 문자도 들어갈 수 있어요. .과 ..은 각각 현재 디렉토리와 상위 디렉토리를 가리키는 특별한 이름이에요. 연속된 여러 슬래시는 하나의 구분자로 해석되는데, 절대 경로에서 처음의 이중 슬래시 //는 예외예요. 경로 끝의 슬래시는 무시돼서 foo, foo/, foo//는 모두 같아요.
/ 루트 디렉토리로 가는 절대 경로
/etc/passwd 루트 디렉토리의 etc 디렉토리에 있는 passwd 파일
. 현재 디렉토리로 가는 상대 경로
foo 현재 디렉토리의 foo 파일
foo/bar 현재 디렉토리 foo 안의 bar 파일
../foo 현재 디렉토리 위 디렉토리의 foo 파일
Windows — Microsoft Windows에서 Tcl은 드라이브 상대 이름과 UNC 스타일 이름을 모두 지원해요. 두 형식 모두 디렉토리 구분자로 /와 \ 둘 다 쓸 수 있어요. 드라이브 상대 이름은 선택적인 드라이브 지정자 뒤에 절대 또는 상대 경로가 붙는 형태예요. UNC 경로는 \\servername\sharename\path\file 형태를 따르는데, 최소한 서버와 공유 구성 요소(\\servername\sharename)는 반드시 포함해야 해요. 두 형식 모두 .과 ..이 특별한 이름이에요.
\\Host\share/file Host의 share 공유 지점 루트에 있는 file (절대 UNC 경로)
c:foo c 드라이브 현재 디렉토리의 foo (볼륨 상대 경로)
c:/foo c 드라이브 루트의 foo (절대 경로)
foo\bar 현재 볼륨 현재 디렉토리 foo 안의 bar (상대 경로)
\foo 현재 볼륨 루트의 foo (볼륨 상대 경로)
\\foo 현재 볼륨 루트의 foo (유효한 UNC가 아니어서 여분의 백슬래시는 무시)
\\Host\share/file에 file dirname을 반복 적용하면 //Host/share가 나오고, 절대 //Host까지만 가진 않아요.
틸드 치환 (TILDE SUBSTITUTION)
파일 이름 규칙 외에도 Tcl은 csh 스타일의 틸드 치환을 지원해요. 파일 이름이 틸드(~)로 시작하면 첫 요소가 해당 사용자의 홈 디렉토리 위치로 바뀐 것으로 해석돼요.
- 틸드 뒤에 바로 구분자가 오면
$HOME환경 변수로 치환돼요. - 그렇지 않으면 틸드와 다음 구분자 사이의 문자를 사용자 이름으로 보고, 그 사용자의 홈 디렉토리를 찾아 치환해요.
이 동작은 Unix, macOS, Windows(매우 오래된 버전 제외)에서 동작해요. 옛 Windows 플랫폼에서는 틸드 뒤에 사용자 이름이 오는 경우를 지원하지 않아서, 그런 경로를 해석하거나 접근하려 하면 '해당 사용자가 없음' 오류가 나요. 틸드만 있고 사용자 이름이 없는 이름은 Unix처럼 $HOME으로 올바르게 치환돼요.
이식성 고려 사항 (PORTABILITY ISSUES)
모든 파일 시스템이 대소문자를 구별하지는 않아요. 그래서 스크립트는 파일 이름의 문자 대소문자에 의존하는 코드를 피해야 해요. 또 장치마다 허용되는 문자 집합이 달라질 수 있으니, <>:?"/\|. 같은 특수 문자 없이 영숫자만으로 이름을 짓는 게 가장 안전해요. 공백이 있는 파일 이름(Windows에서 흔함)과 백슬래시가 디렉토리 구분자인 네이티브 경로 이름에도 주의가 필요해요.
Windows에는 파일·경로 길이 제한이 있어요. 약 260자를 넘는 전체 경로나 파일 이름은 대부분의 파일 작업에서 오류를 일으켜요. 또 Windows에서는 파일 이름 끝의 점을 전부 무시해서 foo.라는 이름으로 만들려 하면 실제로는 foo가 만들어져요(file normalize의 결과에 반영됨). 점만으로 이루어졌거나(........) 점 뒤에 문자가 붙은(.....abc) 이름은 불법이에요.
더 알아보기
file명령어로 파일 경로 조작 — split, join, normalize, pathtype 등glob명령어로 파일 패턴 매칭