리눅스(Linux)에는 시스템 명령을 실행하기 위한 기본 셸인 Bash(Bourne Again Shell)가 탑재되어 있습니다. Bash는 유연성과 강력한 명령줄 인터프리터를 제공하기 때문에 대부분의 개발자가 cmd보다 bash를 선호합니다. 하지만 많은 사용자가 여전히 공백이 포함된 파일 이름을 전달하는 과정에서 어려움을 겪습니다. 그 이유는 bash에서 공백이 파일 이름 안의 공백과 동일하게 취급되지 않기 때문입니다.
왜 Bash는 공백이 있는 파일 이름을 인식하지 못할까?
Bash에서는 이스케이프 문자(\)나 따옴표 없이 여러 단어를 입력하면 모든 단어를 별개의 인수(argument)로 간주합니다. 이는 'cd' 명령으로 디렉터리를 변경하거나 'cat' 명령으로 파일에 접근하는 등 모든 작업에 똑같이 적용됩니다. 즉, 이러한 명령 뒤에 입력하는 내용은 모두 인수로 처리됩니다. 예를 들어 다음과 같습니다.
cat file name.txt
참고: 파일 이름은 무엇이든 될 수 있지만, 이 글에서는 "file name.txt"를 예시로 사용합니다.
위의 'cat' 명령은 file과 name을 하나의 인수가 아니라 두 개의 인수로 인식합니다. 반면 이스케이프 문자나 따옴표를 사용하면 bash 셸은 이를 하나의 인수, 즉 "file name.txt"로 처리합니다.
Bash에서 공백이 있는 파일 이름 다루기
파일 이름의 공백을 처리하는 방법은 몇 가지가 있습니다. 가장 좋은 습관은 앞으로 파일 이름에 공백을 사용하지 않는 것입니다. 가장 간단한 방법은 접근하려는 파일의 이름을 변경하여 공백을 제거하는 것입니다. 그 외에도 공백이 있는 파일 이름에 작은따옴표나 큰따옴표를 감싸거나, 공백 바로 앞에 이스케이프(\) 기호를 붙이는 방법이 있습니다. 아래에서 실제 예시와 함께 각 방법이 어떻게 작동하는지 살펴보겠습니다.
방법 1: 작은따옴표와 큰따옴표 사용
- Ctrl + Alt 키를 누른 상태에서 T 키를 눌러 터미널(Terminal)을 엽니다.
- 다음 명령어로 파일이 위치한 디렉터리로 이동합니다.
(명령어 'cat' 뒤에 파일을 터미널로 드래그 앤 드롭하면 파일 경로/디렉터리에 따옴표가 자동으로 붙습니다.)
cd Desktop
참고: Desktop은 접근하려는 실제 경로로 얼마든지 변경할 수 있습니다.
- 공백이 포함된 이름의 텍스트 파일을 읽으려면 다음 명령어를 입력합니다.
cat 'file name.txt'
또는
cat "file name.txt"
작은따옴표와 큰따옴표는 결과적으로 동일하게 작동합니다. 다만 경우에 따라서는 두 가지를 모두 시도해 보고 어느 쪽이 정상적으로 작동하는지 확인해야 할 수도 있습니다.
방법 2: 백슬래시 이스케이프 문자 사용
- Ctrl + Alt 키를 누른 상태에서 T 키를 눌러 터미널을 엽니다.
- 다음 명령어로 파일이 위치한 디렉터리로 이동합니다.
cd Desktop
참고: Desktop 대신 실제 경로 이름을 입력하세요.
- 명령어를 입력하고, 파일 이름에 공백이 있는 위치마다 이스케이프 문자(\)를 붙여 줍니다.
cat file\ name.txt
보너스: 따옴표와 이스케이프 활용 시 주의사항
명령어에서 디렉터리를 사용할 때 전체 경로에 따옴표를 붙이면 문제가 발생할 수 있습니다. 'mv'나 'cp' 같은 일부 명령은 전체 경로에 따옴표를 사용하면 해당 경로를 파일 소스(source)로 간주하기 때문입니다. 'cp' 같은 명령이 올바르게 작동하려면 소스(source)와 대상(destination) 각각에 개별적으로 따옴표를 지정해야 합니다. 또한 아래 예시에서 확인할 수 있듯이 경로에 이스케이프 문자를 사용하는 방식은 훨씬 더 복잡하여 사용자가 실수하기 쉽습니다.