spaces in file name

Linux

0 views

1. 개요

  • Linux/Unix 파일 시스템에서 공백 문자는 파일명에 사용할 수 있는 유효한 문자다.
    • 하지만 쉘에서는 공백을 명령어 인자를 구분하는 구분자로 해석하기 때문에, 이를 파일명의 일부로 인식시키기 위해서 이스케이프 또는 쿼팅 처리가 필요하다

2. 동작 원리

2.1 쉘의 토큰화 과정

  • 사용자가 터미널에 명령어를 입력하고 엔터를 누르면, 쉘은 다음과 같은 과정을 거친다.
    1. 입력 읽기
      1. 사용자 입력을 문자열로 받아들인다.
    2. 토큰 분리
      1. 쉘의 IFS(Internal Field Separator) 환경변수를 기준으로 문자열을 쪼갠다.
      2. 기본적으로 IFS는 공백, 탭, 개행을 포함한다.
    3. 해석 및 실행
      1. 분리된 토큰을 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...