왜 TMP와 TEMP 환경 변수가 둘 다 있을까? (2015)
4 hours ago
1
- Windows에는 임시 파일 위치를 나타내는 TMP 와 TEMP 가 모두 남아 있으며, 둘이 다를 때 어느 쪽이 쓰이는지는 프로그램 구현에 따라 달라짐
- CP/M에는 환경 변수가 없어서 임시 파일 위치를 프로그램별로 설정해야 했고, WordStar 같은 프로그램은 실행 파일의 특정 바이트를 패치해 동작을 바꾸는 방식을 사용함
- MS-DOS는 CP/M 호환성을 강하게 의식하면서도 환경 변수를 추가했지만, 초기 MS-DOS 프로그램들은 기존 CP/M 관성 때문에 TEMP나 TMP를 거의 사용하지 않음
- MS-DOS 프로그램들이 환경 변수를 설정 저장 수단으로 쓰기 시작하면서 TEMP와 TMP가 경쟁했고, DISKCOPY와 EDIT 같은 일부 프로그램은 TMP보다 TEMP를 먼저 찾았음
- MS-DOS 2.0의 파이프 구현은 임시 파일 위치로 TEMP를 선택했지만, Windows의 GetTempFileName 은 TMP를 먼저 확인해 두 변수가 계속 공존하게 됨
TMP와 TEMP가 둘 다 남은 배경
- Windows 환경 변수에는 임시 파일 위치를 지정하는 변수로 TMP와 TEMP가 모두 존재하며, 둘이 서로 다를 경우 어느 쪽이 맞는지는 프로그램마다 달라짐
- 특정 프로그램이 임시 파일을 어디에 만들지는 그 프로그램의 구현에 달려 있으며, Windows 프로그램은 GetTempFileName 함수를 사용할 가능성이 높고 이 경우 TMP가 우선됨
- 환경 변수 설정 대화상자에 TMP와 TEMP가 함께 보이는 이유는 한쪽이 표준으로 완전히 정리되지 않고, 역사적으로 서로 다른 선택이 공존했기 때문임
CP/M에는 환경 변수가 없었음
- 1973년 무렵 마이크로컴퓨터에서 흔하던 운영체제는 CP/M이었고, CP/M에는 환경 변수가 없었음
- 환경 변수가 없었기 때문에 TMP나 TEMP 환경 변수도 존재하지 않았음
- 프로그램에 임시 파일 저장 위치를 지정하려면 프로그램별 설정이 필요했으며, 실행 파일의 특정 바이트를 패치해 임시 파일을 둘 드라이브 문자를 지정하는 식이었음
- WordStar 같은 프로그램은 매뉴얼에 어떤 바이트를 패치하면 어떤 동작이 바뀌는지 담아뒀고, 프린터 지원 같은 커스텀 서브루틴을 넣을 수 있는 패치 공간도 제공함
MS-DOS와 환경 변수의 등장
- 1981년에 8086 프로세서와 MS-DOS가 등장했으며, 둘 다 CP/M의 영향을 강하게 받음
- MS-DOS의 초기 설계 목표 중 하나는 8080 프로세서용 CP/M 프로그램을 8086 프로세서용 MS-DOS 프로그램으로 기계 번역할 수 있게 하는 것이었음
- 이 번역기는 자기 수정 코드, 명령어 중간으로의 점프, 코드를 데이터로 쓰는 방식 같은 변칙을 쓰지 않는다는 전제를 둠
- 8080의 H와 L 레지스터는 8086의 BH와 BL 레지스터에 대응했고, 8080에서 계산된 주소 접근에 쓸 수 있던 레지스터가 HL뿐이었던 점이 8086에서 AX, BX, CX, DX 중 메모리 접근에 BX만 쓸 수 있었던 이유가 됨
- MS-DOS는 CP/M 호환성 외에 환경 변수를 추가했지만, 기존 CP/M 프로그램은 환경 변수를 쓰지 않았기 때문에 초기 MS-DOS 프로그램도 환경 변수를 사용하지 않음
- 사용자가 TEMP나 TMP를 설정할 수는 있었지만, 초기 프로그램들은 이를 신경 쓰지 않았음
시장에서 TEMP와 TMP가 경쟁함
- 시간이 지나 MS-DOS를 주된 대상으로 삼는 프로그램이 작성되면서, 프로그램들이 환경 변수를 설정 데이터 저장 수단으로 활용하기 시작함
- 임시 파일 위치를 지정하는 환경 변수로 TEMP와 TMP가 각각 쓰이기 시작했고, 둘이 주요 후보로 떠오름
- 어느 변수를 먼저 확인할지는 프로그램 구현 선택에 따라 달라짐
- 많은 프로그램은 양쪽을 모두 만족시키기 위해 TEMP와 TMP를 둘 다 확인했지만, 어느 쪽을 먼저 볼지는 구현마다 달랐음
- 예전 DISKCOPY와 EDIT 프로그램은 TMP보다 TEMP를 먼저 찾았음
MS-DOS 2.0의 파이프와 TEMP
- MS-DOS 2.0은 한 프로그램의 출력을 다른 프로그램의 입력으로 넘기는 파이프 기능을 도입함
- MS-DOS는 단일 작업 운영체제였기 때문에, 파이프는 첫 번째 프로그램의 출력을 임시 파일로 리디렉션해 끝까지 실행한 뒤 두 번째 프로그램을 그 임시 파일에서 입력받도록 실행하는 방식으로 흉내 냄
- 이 기능 때문에 MS-DOS 자체가 임시 파일을 만들 위치를 필요로 하게 됨
- 그 임시 파일 위치를 제어하는 변수로 TEMP가 선택됨
- COMMAND.COM이 TEMP를 선택했더라도 다른 프로그램들이 TEMP나 TMP 중 무엇을 쓸지는 여전히 각 프로그램의 선택으로 남음
Windows에서는 TMP가 우선되는 경로가 생김
- Windows도 비슷한 과정을 거쳤지만, 초기 GetTempFileName 구현은 TEMP보다 TMP를 먼저 확인하도록 만들어짐
- Windows 프로그램이 임시 파일을 만들 때 GetTempFileName을 사용하면 TMP를 더 선호하게 됨
- 따라서 “어느 변수가 맞는가”에 대한 단일 답은 없고, 프로그램이 어떤 API나 자체 로직을 쓰는지에 따라 달라짐
- 현재도 환경 변수 설정 대화상자에는 TMP와 TEMP가 둘 다 남아 있으며, 두 변수는 임시 파일 위치를 두고 계속 공존함
-
Homepage
-
개발자
- 왜 TMP와 TEMP 환경 변수가 둘 다 있을까? (2015)