명령줄: 사람들이 여전히 귀찮게 하는 이유는 무엇입니까?

50년이 훌쩍 넘은 명령줄 인터페이스는 결코 구시대의 유물이 아닙니다. 텍스트 기반 터미널은 그래픽 데스크톱과 터치스크린 기기가 주류인 오늘날에도 여전히 많은 작업을 효율적으로 처리하는 데 유용한 도구입니다.

흥미로운 점은 마이크로소프트가 강력한 새로운 Windows 터미널 애플리케이션을 개발하면서 명령줄에 대한 관심이 그 어느 때보다 높아지고 있다는 것입니다. Windows 10의 PowerShell 환경은 뛰어난 성능을 제공하며, 마이크로소프트는 나아가 Windows 10에 전체 Linux 명령줄 환경을 기본적으로 지원하기 위한 노력도 아끼지 않고 있습니다.

명령줄, 과거에는 유일한 선택지

과거에는 컴퓨터와 상호작용하는 유일한 방법은 키보드로 명령을 입력하는 것이었습니다. 다른 선택의 여지가 없었죠. 천공 카드나 종이 테이프를 사용해야 했던 시대를 생각하면 키보드로 직접 타이핑하는 방식은 혁명적이고 획기적인 변화였습니다. 또한, 종이 롤을 사용하던 구식 전신 타자기에서 음극선관(CRT) 화면으로의 전환은 인간과 컴퓨터 간의 상호작용 방식에 있어 또 다른 중요한 발전이었습니다.

이러한 변화는 대화형 셸이 등장할 수 있는 토대를 마련했습니다. 이제 사용자는 컴퓨터에 지시를 내리면, 컴퓨터는 즉시 화면에 결과를 표시할 수 있게 되었습니다. 더 이상 텔레타이프라이터에서 인쇄물이 나올 때까지 기다릴 필요가 없어졌습니다.

물론 과거와 현재의 컴퓨팅 환경은 완전히 다릅니다. 그래픽 데스크톱 환경이 없는 컴퓨터나 저대역폭 연결을 통해 SSH를 사용하거나 헤드리스 또는 임베디드 시스템을 제어하는 경우, 그래픽 데스크톱보다 명령줄을 사용하는 것이 더욱 효율적입니다.

전문 용어 이해

명령줄, 터미널 창, 셸과 같은 용어는 종종 혼용되지만, 엄밀히 말하면 서로 다른 의미를 지닙니다. 이들은 관련이 있지만 동일한 것은 아닙니다.

터미널 창은 그래픽 데스크톱 환경에서 텔레타이프 터미널을 에뮬레이션하는 역할을 합니다.

셸은 터미널 창 내에서 실행되는 프로그램입니다. 사용자의 입력을 받아, 입력한 내용에 따라 지시를 해석하고 실행하거나, 운영 체제를 구성하는 다른 유틸리티에 전달하거나, 해당 입력과 일치하는 스크립트 또는 프로그램을 찾습니다.

명령줄은 사용자가 명령을 입력하는 공간을 의미합니다. 셸이 사용자 입력을 기다릴 때 나타나는 프롬프트입니다. “명령줄”이라는 용어는 실제로 입력하는 명령 자체를 지칭하기도 합니다. 예를 들어, 다른 사용자에게 프로그램 실행에 대한 어려움을 이야기할 때, “어떤 명령줄을 사용했나요?”라고 물을 수 있습니다. 이때 질문은 어떤 셸을 사용했는지가 아니라, 입력한 정확한 명령을 묻는 것입니다.

이러한 요소들이 결합되어 명령줄 인터페이스(CLI)를 구성합니다.

2024년에 명령줄을 사용하는 이유는?

CLI는 익숙하지 않은 사용자에게는 고루하고 복잡해 보일 수 있습니다. 최신 운영 체제에서 이러한 구식 방식을 사용할 필요가 있을까요? 창, 아이콘, 마우스가 등장하고 그래픽 사용자 인터페이스(GUI)가 보편화된 지 수십 년이 되었는데 말이죠.

GUI가 널리 사용된 것은 사실입니다. 마이크로소프트 윈도우의 첫 번째 버전은 1985년에 출시되었으며, 1990년 윈도우 3.0이 출시되면서 PC 데스크톱 표준으로 자리 잡았습니다.

유닉스와 리눅스에서 사용되는 X 윈도우 시스템은 1984년에 도입되었습니다. 이로써 유닉스 및 그 파생 운영 체제에 그래픽 데스크톱 환경이 제공되었습니다.

하지만 유닉스는 이보다 훨씬 이전인 10년 이상 전에 등장했습니다. 당시에는 다른 선택지가 없었기에 모든 작업은 명령줄을 통해 수행해야 했습니다. 모든 상호작용, 설정, 컴퓨터 사용은 키보드를 통해 이루어져야 했습니다.

실제로 CLI는 모든 작업을 수행할 수 있습니다. GUI는 CLI가 할 수 있는 모든 것을 여전히 따라잡지 못하고 있습니다. CLI가 할 수 있는 기능조차도, 일반적으로 CLI가 더 빠르고 유연하며 스크립팅과 확장이 용이합니다.

그리고 CLI는 표준을 준수합니다.

POSIX 표준의 힘

POSIX는 유닉스 계열 운영 체제 표준입니다. 기본적으로 윈도우를 제외한 모든 운영 체제를 의미합니다. 윈도우조차도 WSL(Linux용 윈도우 하위 시스템)을 통해 POSIX 호환(또는 호환에 가까운) 환경을 제공합니다. POSIX 호환 운영 체제에서 터미널 창을 열면 즉시 셸을 사용할 수 있습니다. 셸이나 배포판이 자체적인 확장 기능이나 개선 사항을 제공하더라도, 핵심적인 POSIX 기능이 제공된다면 바로 스크립트를 실행할 수 있습니다.

명령줄은 가장 기본적인 공통 분모입니다. 사용법을 익히면 어떤 리눅스 배포판이나 그래픽 데스크톱 환경을 사용하더라도 필요한 모든 작업을 수행할 수 있습니다. 각 데스크톱은 고유한 작업 방식을 가지고 있으며, 다양한 리눅스 배포판은 다양한 유틸리티와 프로그램을 제공합니다.

하지만 터미널 창을 열면 마치 집에 온 듯한 편안함을 느낄 수 있습니다.

명령의 협력적인 설계

각각의 리눅스 명령은 특정 작업을 수행하도록 설계되었으며, 그 작업을 효율적으로 처리합니다. 기본적인 설계 철학은 기존 유틸리티와 결합하거나 연결하여 더 많은 기능을 제공하고 원하는 결과를 얻을 수 있는 새로운 유틸리티를 추가하는 것입니다.

이러한 설계 방식은 매우 유용하기 때문에 마이크로소프트는 윈도우 10에 전체 리눅스 명령줄을 지원하기 위해 많은 노력을 기울였습니다!

예를 들어, `sort` 명령은 다른 명령에서 받은 텍스트를 알파벳 순서로 정렬하는 데 사용됩니다. 모든 리눅스 명령에 정렬 기능을 내장할 필요가 없는 것입니다. 일반적으로 GUI 애플리케이션은 이러한 방식의 협업 상호 작용을 허용하지 않습니다.

다음 예시를 살펴보겠습니다. `ls` 명령은 현재 디렉토리에 있는 파일 목록을 출력합니다. 이 결과를 `sort` 명령으로 파이프하여 데이터의 다섯 번째 열(파일 크기)을 기준으로 정렬합니다. 그다음 정렬된 목록은 `head` 명령으로 파이프되어 입력값의 처음 10줄을 출력합니다.

ls -l | sort -nk5,5 | head

이 명령은 현재 디렉토리에서 가장 작은 파일들을 깔끔하게 정렬하여 보여줍니다.

`head` 대신 `tail` 명령을 사용하면 현재 디렉토리에서 가장 큰 파일 10개의 목록을 얻을 수 있습니다.

ls -l | sort -nk5,5 | tail

결과는 예상대로 가장 큰 파일 10개의 목록입니다.

명령의 출력을 리디렉션하여 파일에 저장할 수도 있습니다. 표준 출력(stdin)과 오류 메시지(stderr)를 별도로 저장할 수 있습니다.

명령에는 환경 변수도 포함될 수 있습니다. 다음 명령은 홈 디렉토리의 내용을 출력합니다.

ls $HOME

이 명령은 디렉토리 트리 어디에서든 동일하게 작동합니다.

타이핑이 번거롭다고 생각되더라도 탭 자동 완성 기능을 사용하면 입력해야 하는 양을 줄일 수 있습니다.

스크립트를 이용한 자동화 및 반복

사람은 실수를 하기 쉽습니다.

스크립트를 사용하면 일련의 명령을 표준화하여 스크립트가 실행될 때마다 동일한 방식으로 실행되도록 할 수 있습니다. 이를 통해 시스템 유지 관리에 일관성을 확보할 수 있습니다. 또한, 스크립트에 안전 점검 기능을 추가하여 스크립트가 계속 진행해야 하는지 여부를 결정할 수 있습니다. 이는 사용자가 스스로 판단할 만큼 충분한 지식을 갖출 필요를 없애줍니다.

리눅스 및 다른 유닉스 계열 시스템에서는 `cron`을 사용하여 작업을 자동화할 수 있습니다. 길고 복잡하며 반복적인 작업을 단순화하거나, 최소한 한 번만 설정한 후 자동으로 실행되도록 할 수 있습니다.

PowerShell 스크립트는 윈도우에서도 유사한 기능을 제공하며, 작업 스케줄러를 통해 예약하여 실행할 수 있습니다. 컴퓨터를 설정할 때마다 50가지 다른 옵션을 클릭하는 대신, 모든 변경 사항을 자동으로 수행하는 명령을 실행할 수 있다면 훨씬 효율적입니다.

두 세계의 조화

리눅스든 다른 운영 체제든, 고급 사용자로서 최대한 활용하려면 CLI와 GUI를 모두 사용해야 합니다.

GUI는 애플리케이션 사용에 있어서는 타의 추종을 불허합니다. 열렬한 명령줄 사용자조차도 터미널 창을 벗어나 사무 생산성 도구, 개발 환경, 그래픽 편집 프로그램을 사용해야 할 때가 있습니다.

명령줄을 선호하는 사용자는 GUI를 싫어하는 것이 아니라, 단순히 적절한 작업에 CLI를 사용하는 것이 더 효율적이라고 생각하는 것뿐입니다. 관리 작업의 경우에는 CLI가 더 뛰어납니다. CLI를 사용하면 파일 하나, 디렉토리 하나, 선택한 파일과 디렉토리, 또는 전체 시스템에 이르기까지 동일한 노력으로 변경할 수 있습니다. 반면 GUI를 사용하면 영향을 받는 객체가 증가할수록 키보드 및 마우스 조작을 반복적으로 수행해야 하는 경우가 많습니다.

명령줄은 최고의 제어력을 제공합니다. 모든 명령의 모든 옵션을 사용할 수 있습니다. 그리고 많은 리눅스 명령에는 다양한 옵션이 있습니다. 예를 들어, `lsof` 명령을 살펴보면 매뉴얼 페이지를 살펴본 후 GUI로 구현하는 방법을 생각해 보세요.

사용자에게 효과적인 GUI로 제공하기에는 너무 많은 옵션이 있습니다. GUI는 압도적이고, 매력적이지 않고, 사용하기 어려울 수 있습니다. 이는 GUI의 목표와 완전히 상반되는 것입니다.

명령줄은 적절한 상황에 사용할 때 매우 강력합니다. CLI 사용을 두려워하지 마십시오. 때로는 더 빠르고 효율적인 방법일 수 있습니다. 명령줄을 사용해 보면 결코 후회하지 않을 것입니다.