터미널은 리눅스 시스템의 심장과도 같은 존재입니다. 웹 브라우저 같은 대형 프로그램부터 간단한 텍스트 편집기에 이르기까지, 리눅스에서 실행되는 모든 프로그램은 터미널 명령줄 위에서 동작합니다. 따라서 운영체제의 작동 원리를 제대로 이해하고 싶다면 터미널을 능숙하게 다루는 것이 중요한 첫걸음입니다.
터미널 작업을 하다 보면 명령어의 출력 결과를 파일로 저장해야 할 때가 있습니다. 저장된 파일은 이후 다른 작업의 입력값으로 활용하거나, 단순히 터미널 활동 기록(log)으로 남겨둘 수 있습니다. 이 글에서는 터미널 출력을 파일에 저장하는 다섯 가지 방법을 소개합니다.
1. 출력 저장을 지원하는 터미널 활용하기
가장 손쉬운 방법은 출력을 파일로 저장하는 기능을 자체적으로 제공하는 터미널을 사용하는 것입니다. 예를 들어 KDE 데스크톱 환경에 기본 포함된 Konsole 터미널에는 출력을 파일로 기록하는 옵션이 내장되어 있습니다.
메뉴 모음에서 [파일] 버튼을 클릭한 뒤 [출력을 다른 이름으로 저장(Save output as...)]을 선택하면 됩니다.
그러면 대화상자가 열리고, 원하는 위치에 터미널 출력을 파일로 저장할 수 있습니다.
GNOME 터미널에서도 비슷한 방식으로 출력을 저장할 수 있습니다. 터미널 화면에서 마우스 오른쪽 버튼을 클릭하고 [HTML로 출력 복사(Copy output as HTML)]를 선택하면 터미널 텍스트가 클립보드에 담깁니다. 이후 아무 텍스트 편집기에나 붙여넣기만 하면 됩니다.
2. 출력 리다이렉션(Redirection) 연산자
두 번째 방법은 유닉스 셸에 기본 내장된 연산자를 활용하는 것입니다. 이는 리눅스의 기본 기능으로, 프로그램의 텍스트 출력을 파일로 전환(redirect)할 수 있습니다. 대표적인 연산자는 세 가지입니다.
>: 파일을 새로 생성하거나 기존 내용을 덮어써서 프로그램 출력을 저장합니다. 현재 실행 결과를 동일한 파일에 계속 기록하고 싶을 때 유용합니다.>>: 역시 파일을 생성하지만, 기존 내용을 덮어쓰지 않고 출력을 이어서 추가(append)합니다. 여러 번의 실행 결과를 하나의 파일에 누적하고 싶을 때 적합합니다.2>: 프로그램이 반환하는 오류 메시지만 별도로 기록하는 특수 연산자입니다. 프로그램이 비정상 종료되기 직전에 어떤 문제가 발생했는지 확인할 수 있어 디버깅 시 매우 유용합니다.
사용법은 간단합니다. 명령어 끝에 연산자와 파일명을 붙이면 됩니다. 다음 예시를 살펴보겠습니다.
echo "maketecheasier" > hello.txt
위 명령은 echo 프로그램에게 "maketecheasier"라는 문자열을 출력하도록 지시한 뒤, > 연산자와 파일명을 추가했습니다. 그 결과 유닉스 셸은 화면에 출력하는 대신 "hello.txt" 파일에 해당 내용을 기록합니다.
3. tee 명령어 활용하기
출력 리다이렉션 외에도 tee라는 GNU 프로그램을 사용하면 터미널 명령의 출력을 파일로 저장할 수 있습니다. tee는 표준 입력을 읽어 화면에 표시하면서 동시에 파일에 기록하는 도구로, 유닉스 파이프(|)와 함께 사용하면 명령어의 출력을 파일로 넘길 수 있습니다.
다음 예시를 확인해 보세요.
echo "maketecheasier" | tee hello.txt
여기서는 출력 리다이렉션 대신 파이프(|)를 사용해 echo의 출력을 tee로 전달했습니다.
참고: 파이프(pipe)는 한 프로그램의 출력을 다른 프로그램의 입력으로 연결해 주는 기능입니다. 표준 입출력을 사용하는 프로그램이라면 여러 개를 사슬처럼 엮어 조합할 수 있다는 점이 큰 장점입니다.
4. script 명령어로 세션 전체 기록하기
터미널 출력을 추출하는 또 다른 방법은 script 명령어입니다. 리눅스에 기본 내장된 이 프로그램은 터미널에 입력한 모든 내용과 그 출력 결과를 통째로 기록합니다.
script를 사용하면 터미널 세션 전체 로그를 파싱 가능한 텍스트 형식으로 남길 수 있습니다. 오류 로그를 온라인 커뮤니티에 올려 다른 사람들의 도움을 받고 싶을 때 특히 유용합니다.
사용 방법은 다음과 같습니다.
script filename.txt
명령을 실행하면 script 환경이 시작되며, 이후 일반적인 명령어를 자유롭게 입력하면 됩니다. 다만 한 가지 주의할 점은, script가 해당 세션에서 하는 모든 행동을 기록한다는 것입니다. 실제 기록 예시는 다음과 같습니다.
Script started on 2022-03-27 18:02:29+08:00 [TERM="rxvt-unicode-256color" TTY="/dev/pts/2" COLUMNS="77" LINES="22"] $ ls Desktop Downloads mail News pods documents hello.txt Mail pics tmp vids $ exit exit Script done on 2022-03-27 18:03:19+08:00 [COMMAND_EXIT_CODE="0"]
script는 입력한 모든 키 입력과 제어 문자까지 포함합니다. 필자의 경우 Tab이나 Backspace 같은 '보이지 않는' 키 입력까지 모두 기록되었습니다.
세션을 마치려면 exit를 입력하세요. script 프로그램이 종료되면서 지정한 파일에 전체 로그가 저장됩니다.
5. 프레임버퍼(Framebuffer) 캡처
마지막 방법은 리눅스 프레임버퍼에서 직접 터미널 화면을 가져오는 것입니다. GUI 없이 순수 텔레타이(Teletype, TTY) 환경에서 작업하면서 프로그램의 출력을 캡처해야 할 때 유용합니다.
프레임버퍼 장치를 캡처하려면 텔레타이 환경에서 다음 명령을 실행합니다.
cat /dev/fb0 > capture.raw
단, 이 방식은 프레임버퍼의 원시(raw) 바이트 데이터를 그대로 덤프하는 것이라는 점에 유의해야 합니다. 생성된 파일을 보려면 이미지 편집기에서 불러온 뒤 색상 깊이와 비트 깊이를 수동으로 맞춰야 합니다. 시간이 많이 걸릴뿐더러 실수하기도 쉽습니다.
따라서 fbgrab 같은 서드파티 프로그램을 사용하는 편이 좋습니다. fbgrab은 현재 텔레타이 화면을 프레임버퍼 장치에서 가져와 PPM 또는 PNG 파일로 저장해 줍니다.
fbgrab 설치도 비교적 간단합니다. Debian 및 Ubuntu 계열 배포판에서는 apt를 사용합니다.
sudo apt install fbgrab
Arch Linux에서는 pacman을 실행합니다.
sudo pacman -S fbgrab
fbgrab으로 터미널 출력 캡처하기
설치가 완료되면 Ctrl + Shift + Alt + F3 키를 눌러 텔레타이로 진입한 뒤, fbcat 또는 fbgrab을 실행합니다.
fbcat은 더 단순한 프로그램으로, 현재 프레임버퍼 화면을 잡아 PPM 이미지로 저장합니다. PPM은 저수준 원시 이미지 형식으로, 이미지 편집기에서 불러와 PNG로 변환할 수 있습니다. fbcat은 낮은 비트 깊이의 디스플레이를 원시 이미지 형식으로 정확하게 캡처해야 할 때 주로 유용합니다.
fbcat으로 캡처하려면 다음 명령을 실행합니다.
fbcat > capture.ppm
현재 표시 중인 화면을 grab하여 capture.ppm 파일에 저장합니다.
반면 fbgrab은 더 높은 비트 깊이의 디스플레이를 캡처하도록 설계된 좀 더 강력한 프로그램입니다. 대부분의 경우 텔레타이 화면 캡처에 사용하며, 기본적으로 PNG 저장을 지원하고 캡처할 텔레타이를 선택하는 옵션도 제공합니다.
fbgrab으로 캡처하려면 다음 명령을 실행합니다.
sudo fbgrab -c 3 capture.png
이 명령은 세 번째 텔레타이 화면을 캡처하여 capture.png 파일로 저장합니다.
리눅스 터미널 관련 추가 가이드가 필요하다면, 커맨드 라인에서 이메일을 보내는 방법을 다룬 글도 함께 참고해 보세요.
자주 묻는 질문(FAQ)
1. fbgrab이 작동하지 않고 검은색 또는 빈 이미지만 저장됩니다. 어떻게 해야 하나요?
fbgrab이 터미널 출력을 캡처할 때 시스템이 실제로 사용하는 것과 다른 프레임버퍼 장치를 참조하고 있을 가능성이 큽니다. "/dev" 폴더 목록을 조회하여 현재 사용 중인 프레임버퍼 장치를 확인해 보세요.
ls /dev
목록에서 "/dev/fbX" 형태의 장치를 찾으세요. 일반적으로 리눅스는 "/dev/fb0"을 프레임버퍼로 사용하지만, 시스템이 "/dev/fb1" 같은 다른 프레임버퍼를 사용 중이라면 다음 명령으로 fbgrab이 해당 장치를 참조하도록 지정할 수 있습니다.
fbgrab -d 1 capture.png
2. 파일의 내용을 프로그램의 입력으로 넣을 수도 있나요?
네, 가능합니다! 앞서 소개한 세 가지 연산자 외에도 < 연산자를 사용하면 파일에서 데이터를 읽어와 프로그램의 입력으로 전달할 수 있습니다.
이 방식을 사용하면 cat 같은 다른 프로그램에 의존하지 않고도 파일 내용을 바로 전달할 수 있습니다. 다음 두 예시를 비교해 보세요.
[1] cat test.txt | program [2] program < test.txt
- 첫 번째 예시는 cat 프로그램으로 텍스트를 불러온 뒤, 파이프 연산자를 통해 그 출력을 program에 전달합니다.
- 반면 두 번째 예시는 곧바로 program을 호출하고,
<연산자가 그 다음 인수(test.txt)를 프로그램의 입력으로 처리합니다.
3. script 명령어로 특정 명령어의 출력만 캡처할 수 있나요?
네, 단일 명령어만 대상으로 script를 실행할 수 있습니다. 하나의 프로그램 출력만 기록하면 되는 문제 해결 상황에서 특히 유용합니다. 다음 명령을 사용하세요.
script -c "your-command" test.txt
-c 플래그는 script 프로그램에게 your-command라는 프로그램만 실행하도록 지시합니다. 이후 그 출력 결과가 test.txt라는 텍스트 파일에 기록됩니다.