0 views
1. 개요
- Linux/Unix 파일 시스템에서 공백 문자는 파일명에 사용할 수 있는 유효한 문자다.
- 하지만 쉘에서는 공백을 명령어 인자를 구분하는 구분자로 해석하기 때문에, 이를 파일명의 일부로 인식시키기 위해서 이스케이프 또는 쿼팅 처리가 필요하다
2. 동작 원리
2.1 쉘의 토큰화 과정
- 사용자가 터미널에 명령어를 입력하고 엔터를 누르면, 쉘은 다음과 같은 과정을 거친다.
- 입력 읽기
- 사용자 입력을 문자열로 받아들인다.
- 토큰 분리
- 쉘의 IFS(Internal Field Separator) 환경변수를 기준으로 문자열을 쪼갠다.
- 기본적으로 IFS는 공백, 탭, 개행을 포함한다.
- 해석 및 실행
- 분리된 토큰을 argv 배열에 담아서 커널의 시스템 콜로 전달한다.
- 입력 읽기
2.2 메모리 상의 인자 전달 구조 (argv)
cat spaces in this filename을 입력했을 때, 메모리 상에서main(int argc, char *argv[])함수에 전달되는 인자는 다음과 같이 구성된다.- 잘못된 경우 (이스케이프 없음):
argv[0]: "cat" (실행할 프로그램)argv[1]: "spaces" (첫 번째 파일)argv[2]: "in" (두 번째 파일) ...- 결과:
cat: spaces: No such file or directory에러 발생.
- 올바른 경우 (이스케이프/쿼팅 사용):
argv[0]: "cat"argv[1]: "spaces in this filename" (하나의 파일)- 결과: 파일 내용 출력 성공.
- 잘못된 경우 (이스케이프 없음):
2.3 이스케이프 문자의 역할
- 백슬래시(
\)는 쉘에게 "바로 뒤에 오는 문자의 특수한 기능을 무시하고, 문자 그대로(Literal) 해석하라"고 지시한다.- 즉, 공백의 '구분자' 기능을 무시하고 '공백 문자' 그 자체로 인식하게 만든다.
3. 사용법 및 구문
- bandit 문제를 해결할 때 파일을 읽을 때 발생한 문제를 해결하기 위해서 다음과 같은 방법들이 존재한다.
3.1 백슬래시 사용
-
공백 문자 앞에 \를 붙여서 공백을 이스케이프한다.
# 공백(space) 앞에 \(backslash)를 붙여준다. cat spaces\ in\ this\ filename
3.2 따옴표(Quoting) 사용
-
파일 이름 전체를 따옴표로 감싼다. 쉘은 따옴표 안에 있는 모든 공백을 하나의 문자열로 취급한다.
# 큰따옴표 (" ") 사용 cat "spaces in this filename" # 작은따옴표 (' ') 사용 -> 변수 확장이 필요 없을 때 더 안전함 cat 'spaces in this filename'
3.3 탭 자동완성
- 가장 실수를 줄이는 방법이다.
- 파일 이름의 앞부분만 입력하고
Tab키를 누르면 쉘이 자동으로 적절한 이스케이프 처리를 수행한다.
- 파일 이름의 앞부분만 입력하고
# 1. 파일 이름의 앞부분 입력
cat spa
# 2. [Tab] 키 누르기
# 쉘이 자동으로 다음과 같이 완성해준다.
cat spaces\ in\ this\ filename
Loading comments...