많은 명령행 UNIX 및 Linux® 명령(매뉴얼 페이지)에 대한 온라인 참조 정보가 이런 명령에 대한 정보를 얻을 수 있는 1차적 소스라 할 수 있다. 매뉴얼 페이지에는 해당 명령에 사용 가능한 모든 옵션이 설명되어 있으며, 많은 경우 프로그램 프롬프트와 연관된 사용자 입력을 포함하여 연관된 프로그램 출력 예제도 함께 수록된다.
이런 정보를 얻으려면 누군가 적절한 예제를 작성해야 한다. 대체로 사용자에게 제시될 가능성이 있는 모든 프롬프트와 이때 표시되는 시나리오를 확인하려고 소스 코드를 읽어보는 것보다는 그냥 단순히 프로그램을 실행해보고 소스 코드가 어떤 작업을 수행하는지 확인하는 것이 더 실용적이다. 애플리케이션 개발자나 애플리케이션에 대한 참조 정보를 작성하는 테크니컬 라이터는 경험을 통해 프로그램 입력, 애플리케이션에서 표시되는 정보 프롬프트 및 그런 프롬프트에 대한 응답인 사용자 입력 내용 전체를 레코드로 유지하는 것이 이런 예제 실습을 문서화하는 데 유용한 방법임을 깨달았다.
사용자와 명령행 애플리케이션의 상호 작용을 캡처하는 것은 단순히 어떤 내용을 작성하는 작업과는 다르다. 대다수의 명령행 애플리케이션 개발자는 C
프로그래밍 언어의 printf() 명령(또는 다른 언어에서 같은 기능을 하는 명령)을 초기 디버깅 도구로 사용하는데, 이 명령을 통해
애플리케이션의 여러 가지 다양한 변수의 내용과 데이터 구조를 표시할 수 있다. 표시되는 정보의 양에 따라, 이후의 검사와 분석을 위해 출력된 내용을 파일에
캡처하는 것이 보통 가장 쉬운 방법이다. 이와 유사하게, 시스템 관리자들은 대화식 시스템 또는 서버 구성과 초기화 과정을 단계별로 꼼꼼히 기록하는 방법을
자주 사용한다.
이 기사의 다음 섹션에서는 모든 UNIX 및 Linux 쉘에 포함된 기능을 사용하는 것부터 특정한 도구를 사용하여 이런 유형의 정보 캡처를 자동화하는 방법까지, 사용자와 명령행 애플리케이션의 상호 작용을 캡처하는 다양한 방법을 살펴본다.
UNIX 및 Linux 시스템에서는 쉘이라고 하는 명령 해석기에 내장된 기능을 사용하여 프로그램 출력과 오류를 별개의 파일에 손쉽게 캡처할 수 있다. 쉘 리디렉션으로 알려진 이런 기능을 통해 꺾쇠 괄호 문자나 숫자 ID를 사용하여 프로그램 출력(표준 출력 또는 stdout이라고도 함)과 프로그램 오류 출력(표준 오류 또는 stderr이라고도 함)을 특정 파일이나 다른 대상으로 리디렉션할 수 있다. 다음 목록에 표시된 것처럼, 다른 쉘들에서는 약간 다른 구문을 사용하여 프로그램 출력과 오류 메시지를 캡처한다.
-
ls프로그램의 표준 출력을 /bin/sh, /bin/bash, /bin/csh 및 /bin/ksh 쉘의 file1 파일에 쓰려면 다음 구문을 사용한다.ls > file1
-
ls프로그램의 오류 출력을 /bin/sh, /bin/bash, /bin/csh 및 /bin/ksh 쉘의 file1 파일에 쓰려면 다음 구문을 사용한다.ls 2> file1
(/bin/csh 쉘을 사용 중인 경우 오류 메시지만 파일로 쉽게 리디렉션할 방법은 없다.)
-
ls프로그램의 표준 및 오류 출력을 모두 /bin/sh, /bin/bash, /bin/csh 및 /bin/ksh 쉘의 file1 파일에 쓰려면 다음 구문을 사용한다.ls &> file1
-
ls프로그램의 표준 출력과 이 명령의 오류 출력을 각각 /bin/sh, /bin/bash 및 /bin/ksh 쉘의 file1 및 file2 파일에 쓰려면 다음 구문을 사용한다.ls 1> file1 2> file2
프로그램의 표준 프로그램 출력이나 오류 메시지 또는 두 가지 모두를 텍스트 파일로 캡처할 때 쉘 리디렉션을 편리하게 사용할 수 있다. 하지만, 정말로 수행하려는 작업이 사용자와 프로그램의 상호 작용을 캡처하는 것이라면 이것만으로는 부족하다. 쉘의 대화식 기능과 파이프라고 하는 추가적인 출력 리디렉션 유형을 사용하면 올바로 캡처할 수 있다.
이전 섹션에서는 디버깅 출력, 프로그램 사용 정보 등을 캡처하려는 경우 도움이 되도록, 특정 파일에 사용자의 상호 작용을 구체적으로 작성하는 방법을
보여주었다. 하지만, 애플리케이션에 대한 문서를 쓰고 있거나 단순히 애플리케이션을 사용하거나 실험한 내용을 레코드로 유지하려는 경우에는 프로그램에 입력
데이터로 제공하는 내용(표준 입력 또는 stdin으로 알려진 것의 예)과 그 입력에 대한 애플리케이션의 반응을 확인하고 싶을 것이다. 본 기사의
마지막 두 섹션에서는 그런 목적으로 디자인된 몇 가지 애플리케이션에 대해 설명한다. 이 섹션에서는 사용자가 자주 쓰는 쉘, 파이프라고 하는 추가적인 유형의
쉘 리디렉션, tee라고 하는 표준 UNIX 또는 Linux 유틸리티를 사용하여 위 작업을 수행할 수 있는 방법에 초점을 맞춘다.
UNIX 및 Linux 쉘에서 파이프는 "|" 기호로 표현되며 한 명령의 표준 출력을 다른 명령의 표준 입력에 연결해준다. 다양한 플러밍
커넥터에 익숙하다면 UNIX 또는 Linux tee 애플리케이션은 그 이름이 암시하는 역할을 수행한다는 것을 알 수 있다.—이
애플리케이션은 입력을 두 개의 다른 스트림으로 분할한다. 이들 중 하나는 표준 출력으로 남지만, 다른 것은 사용자가 명령행에 지정하는 이름을 가진
파일이다. 따라서 파이프와 tee 명령의 조합을 사용하여 프로그램의 출력을 파일로 리디렉션하여 출력 내용을 볼 수 있다. 예를 들어,
다음 명령을 실행하면 ls /etc 명령의 출력을 둘 다 표시하고 ls.out 파일에서 그 명령의 표준 출력을 캡처할 수 있다.
ls /etc | tee ls.out
|
"|&" 문자를 사용하여 명령행에서 파이프를 통해 표준 오류와 표준 출력을 리디렉션할 수도 있다. 예를 들어, 다음 명령을
실행하면 ls /etc 명령의 출력과 모든 오류 메시지가 표시되고, 이때 tee 명령을 사용하여 ls.out 파일에
출력과 오류 메시지가 캡처된다.
ls /etc |& tee ls.out
|
다음과 같은 명령을 사용하여 파이프, tee 명령 및 자주 사용하는 쉘의 대화식 모드를 통해 표준 출력과 표준 오류의 리디렉션을
조합하여 모든 입력, 출력 및 오류 메시지를 파일에 캡처할 수 있다.
bash -i |& tee output_file.txt
|
이 명령은 대화식 모드에서 Bash 쉘을 실행하는데, 이는 Bash 쉘이 본질적으로 사용자가 이를 명시적으로 종료할 때까지는 상호 작용할 수 있는 쉘이라는
뜻이다. 이 명령에서는 "|&" 문자를 사용하여 해당 쉘의 모든 출력과 오류 메시지를 tee 명령으로
리디렉션하고, tee 명령을 통해 모든 출력 및 오류 메시지를 표시하고 모든 내용의 사본을 output_file.txt 파일에 저장한다. 상호 작용을 캡처할 모든 명령의 실행을
완료하면 exit 명령(또는 대부분의 시스템에서는 Control-d 키 조합)을 입력하여 쉘을 종료할 수 있다. output_file.txt
파일에는 사용자가 입력한 모든 것, 실행한 프로그램의 모든 출력, 명령 실행 후 표시된 모든 오류 메시지의 전체 레코드—명령을 실행하는 동안 보았던 것과
정확히 같은 내용이 포함된다.
bash -i |& tee output_file.txt와 같은 UNIX 및 Linux 명령이 실제로는 그리 복잡하지 않지만, 이런 명령을 정확히 입력하고
"|" 및 "&" 문자의 정확한 순서를 기억하고 tee 명령을 기억하는 등의
일이 혼란스럽게 느껴질 수 있다. 대부분의 UNIX 및 Linux 시스템에서 사용 가능한 훨씬 더 간단한 해결책은 모든 것을 자동으로 처리하는 script
명령이다. script 명령은 서브쉘을 시작하고 사용자가 입력하는 모든 것, 사용자가 실행하는 모든 프로그램의 모든 출력, 그런 프로그램에서
발생하는 모든 오류의 사본을 출력 파일에 저장하는 역할을 한다. 모든 내용을 저장할 파일의 이름을 지정하지 않으면 script 명령에서 typescript라는 파일을 만들지만,
명령행에서 데이터를 기록할 파일의 이름을 지정할 수도 있다. 예를 들어, 다음 명령으로 사용자가 입력하는 모든 것, 모든 프로그램 출력 및 모든 오류 메시지를
output_file.txt 파일로 캡처할 수 있다.
script output_file.txt
|
이전 섹션에서 설명한 대화식 쉘을 사용하는 것과 비슷한 방법으로, exit 명령(또는 대부분의 시스템에서는 Control-d
키 조합)을 입력하여 script 명령을 종료하고 출력 파일을 닫는다.
이전 섹션에서 설명한 대화식 쉘 메커니즘에 의해 생성된 출력 파일의 내용과 script 명령을 사용하여 생성된 출력 파일의 내용을
비교해보면, script 명령으로 생성된 파일에는 보통 백스페이스, 리턴, 팬시 프롬프트를 표시하는 데 사용되는 특수 문자, 이전 쉘
명령을 편집하는 경우 사용되는 문자와 같은 제어 문자가 포함된 것을 바로 알 수 있다. script 명령으로 생성되는 출력 파일에는
사용자가 입력한 내용을 쉘에서 어떻게 해석하는지가 아니라, 입력 내용 그대로 정확히 들어 있기 때문에 이런 문자가 포함되는 것이다. 이전 섹션에서 설명한
대화식 쉘 메커니즘을 사용하여 생성된 출력 파일에는 백스페이스 및 리턴과 같은 제어 문자가 처리된 후에 결과적으로 쉘에 전달되는 내용이 들어 있기 때문에
이런 문자는 포함되지 않는다.
자주 사용하는 텍스트 편집기를 사용하면 스크립트 출력 파일을 손쉽게 정리할 수 있고, 웹에서 다양한 정리 스크립트를 구할 수 있다. 필자가 즐겨 사용하는
정리 메커니즘은 Perl Monks 웹 사이트에서 구한 것으로, 이 메커니즘에서는 입력 데이터에서 제어 문자를 필터링하여 제거하는 표준 UNIX 및 Linux
col 명령과 간단한 Perl 명령의 조합을 사용하여 script 명령에 의해 생성되는 출력 파일을 정리한다. 예를
들어, output_file.txt라는 이름을 가진 스크립트 출력 파일의 output_file.txt.clean이라는 이름을 가진 정리된 사본을 작성하려면 Listing 1에
표시된 명령을 실행한다.
Listing 1. 스크립트 출력 정리
cat output_file.txt | \
perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' |\
col -b > output_file.txt.clean
|
이런 종류의 작업을 자주 수행한다면, 아마 두 번째 행에서 Perl 대체 명령을 입력하는 데 문제가 있을 경우에 이 프로세스를 자동화하기 위한 작은 쉘 스크립트를 작성하고 싶을 것이다. Listing 2는 이런 역할을 수행하는 간단한 쉘 스크립트이다.
Listing 2. 스크립트 출력을 정리하기 위한 쉘 스크립트
#!/bin/bash
if [ $# -ne 2 ] ; then
echo "Usage: cleanup script-file output-file"
exit
fi
cat $1 | \
perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' |\
col -b > $2
|
이전 섹션에서 설명한 대화식 쉘 명령인 쉘 리디렉션과 이 섹션에서 설명한 script 명령은 모두 거의 모든 UNIX 및 Linux 시스템에서
사용할 수 있는 프로그램 상호 작용을 캡처하기 위한 메커니즘이다. 하지만, 일부 UNIX 시스템에서는 프로그램 상호 작용을 캡처하기 위한 도구를 추가로
제공한다. 이런 추가 도구에서는 다음 섹션에서 설명하는 바와 같은 특수한 상황에서 유용하게 쓰일 수 있는 기능을 추가로 제공한다.
대부분의 UNIX 및 Linux 시스템에서는 단순히 프로그램 상호 작용 캡처를 자동화하기 위해 script 명령을 제공하지만, AIX 운영
체제에서는 특정 화면의 텍스트를 파일에 쓸 수 있게 해주는 capture라는 이름의 편리한 유틸리티를 제공한다. 이 유틸리티는
텍스트 편집기와 같이, 화면을 조작하는 명령을 실행하는 예제를 보여주려 할 때 요긴하다. 쉘 리디렉션 또는 스크립트 명령을 사용하여 어떤 파일에
vi 편집기를 사용하는 예제를 캡처하면 많은 제어 문자가 들어 있고 본질적으로 이해할 수 없는 출력 파일이 생성된다.
명령행에서 데이터를 기록할 특정 파일의 이름을 지정하지 않으면 AIX capture 명령을 통해 screen.out이라는 파일이
작성된다. capture 명령을 시작하면 화면에 캡처하려는 내용이 정확히 표시될 때까지 원하는 명령을 모두 실행할 수 있는 쉘이
생성된다. 그 지점에서 Control-p 키 조합을 입력하면 화면의 내용이 출력 파일에 기록된다. capture 명령을 종료하려면 exit
명령(또는 대부분의 시스템에서는 Control-d)을 입력하면 된다.
capture 명령을 사용할 때, Control-p를 입력할 때까지는 화면 상의 텍스트가 캡처되지 않고 -a
옵션을 사용하여 capture 명령을 시작함으로써 출력 파일을 덮어쓰지 말고 출력 파일에 추가하도록 지정하지 않으면 Control-p를 여러 번 입력하는 경우
출력 파일을 그냥 덮어쓰게 된다는 점을 기억해야 한다.
프로그램과의 상호 작용을 캡처하는 일은 놀랄 정도로 흔한 작업이다. UNIX 및 Linux 쉘에서 해당 상호 작용의 특정 부분을 텍스트 파일에 쓰기 위한
내장 메커니즘을 제공하지만, 대화식 쉘이나 script 명령을 사용하면 프로그램 상호 작용의 순차적인 레코드 전체를 제공하는 단일
출력 파일이 생성된다. 이런 출력 파일을 만들고 필요한 경우 이런 파일을 정리하기 위한 메커니즘은 거의 모든 UNIX 또는 Linux 관련 테크니컬 라이터, 개발자 또는
시스템 관리자에게 유용한 도구이다.
본 시리즈의 다음 기사에서는 UNIX 및 Linux 시스템의 전체 화면 또는 특정 창을 보여주는 이미지를 캡처하기 위한 표준 도구에 대해 설명하겠다. 또한, 그런 이미지를 다양한 표준 그래픽 형식으로 변환하는 방법도 설명하겠다.
교육
-
AIX와 UNIX developerWorks 영역에는 모든 AIX 시스템 관리 분야와 관련된 다양한 정보와 UNIX 기술을 발전시킬 수 있는 다양한 정보가 있다.
-
AIX 및 UNIX 입문 AIX와 UNIX 입문 페이지에서 자세한 정보를 볼 수 있다.
-
기술 서점에서 다양한 기술 주제와 관련된 서적을 살펴보자.
제품 및 기술 얻기
-
script명령은 대부분의 UNIX 및 Linux 시스템에 기본적으로 설치되어 있고, 그 자체가 Linux 시스템에 있는util-linux패키지의 일부인bsdutils패키지에 들어 있다. 이 패키지의 소스 코드는 해당 시스템용 표준 패키지의 일부로 구하거나 ftp://ftp.us.kernel.org/pub/linux/utils/util-linux/에서 구할 수 있다. -
Perl Monks 웹 사이트에서는
script출력을 정리하기 위해 이 기사에서 사용된 주문을 제공했고 Perl 사용자를 위한 다른 유용한 팁도 많이 제공한다.
토론
-
developerWorks 블로그를 살펴보자.
- Twitter의 developerWorks 페이지를 살펴보자.
- My developerWorks 커뮤니티에 참여하자.
- AIX 및 UNIX 포럼에 참여하자.
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- IBM Support Assistant Forum
- Performance Tools Forum
- Virtualization Forum
- 기타 AIX and UNIX Forums
William von Hagen là một người quản trị hệ thống UNIX, một tác giả chuyên viết về UNIX trong hơn 20 năm qua. Ông cũng là người nhiệt tình ủng hộ hệ điều hành Linux từ năm 1993. Bill là đồng tác giả của rất nhiều cuốn sách viết về các đề tài như: Ubuntu Linux, Xen Virtualization, the GNU Compiler Collection (GCC) (Tập hợp các chương trình biên dịch GNU), SUSE Linux, Mac OS X, các hệ thống tệp Linux, và SGML. Ông cũng viết rất nhiều bài về hệ điều hành Linux và các bài viết về Mac OS X được xuất bản hoặc đăng trên các trang Web.