리눅스 기본 명령어, 표준 입출력, 파이프
이번 포스팅은 시스템 프로그래밍 학습에 필수적인 리눅스(Linux) 환경에 대한 내용을 정리한 것이다. 리눅스 환경에서 반드시 이해해야 할 기본적인 명령어들과 더불어, 프로그램의 입출력을 제어하는 핵심 개념인 표준 입출력(stdin, stdout)과 리디렉션(Redirection), 그리고 유용한 데이터 처리 메커니즘인 파이프(pipe)에 대해 자세히 알아보고자 한다. 다양한 컴퓨팅 환경에서 오픈소스 생태계가 가장 잘 구축되어있는 리눅스 사용은 피할 수 없고, 이러한 기본적인 개념을 확립하는 것은 연구 및 개발 생산성을 극대화하는 데 결정적인 역할을 할 것이다.
![]() |
Linux logo |
리눅스 기본 명령어: 터미널과의 효과적인 대화
리눅스 명령어는 커맨드 라인 인터페이스(Command Line Interface, CLI) 환경에서 사용자와 컴퓨터 간의 상호작용을 가능하게 하는 기본적인 도구이다. 그래픽 사용자 인터페이스(Graphical User Interface, GUI) 역시 내부적으로는 이러한 명령어들을 추상화하여 제공하는 것에 불과하다. 리눅스 환경에 익숙해지기 위해서는 터미널(Terminal)을 실행하는 것부터 시작해야 한다. 터미널은 명령어(commands)를 통해 사용자가 셸(shell)과 상호작용할 수 있도록 인터페이스를 제공한다.(지난 글 참고) 대부분의 리눅스 배포판에서는 Ctrl + Alt + T
키 조합으로 터미널을 열 수 있으며, 만약 작동하지 않는다면 애플리케이션 메뉴에서 "터미널"을 검색하여 실행할 수 있다.
이제 가장 자주 사용되는 기본적인 리눅스 명령어들을 살펴보자. 각 명령어는 특정 작업을 수행하며, 플래그(flag)와 인자(argument)를 통해 그 동작 방식을 세밀하게 제어할 수 있다. 플래그는 명령어에 옵션을 전달하는 방법으로, 대개 하이픈(-
)이나 이중 하이픈(--
)과 함께 사용된다. 많은 명령어들이 -h
또는 --help
플래그를 통해 도움말 페이지를 제공한다. 인자는 명령어 실행에 필요한 입력값으로, 파일 경로 등이 될 수 있다.
ls
: 현재 디렉토리 또는 지정된 디렉토리의 내용(파일 및 하위 디렉토리)을 나열한다. 다양한 플래그를 통해 출력 방식을 변경할 수 있다. 예를 들어,ls --color=auto
는 파일과 디렉토리를 색상으로 구분하여 표시한다. 매번 플래그를 입력하는 번거로움을 줄이기 위해alias
명령어를 사용하여 단축키를 정의할 수도 있다. 예를 들어,alias ll="ls -alF"
와 같이 자주 사용하는 옵션을 묶어 새로운 명령어로 만들 수 있다. 정의된 alias는alias
명령어만 입력하여 확인할 수 있으며,unalias
명령어를 사용하여 삭제할 수 있다.pwd
: "print working directory"의 약자로, 현재 작업 중인 디렉토리의 절대 경로를 출력한다.cd
: "change directory"의 약자로, 지정된 디렉토리로 이동한다. 상대 경로 또는 절대 경로를 사용할 수 있으며,cd
만 입력하면 홈 디렉토리로 이동하고,cd ..
은 한 단계 상위 디렉토리로 이동하며,cd -
는 이전 작업 디렉토리로 돌아간다.mkdir [디렉토리_이름]
: 새로운 디렉토리를 생성한다.-p
플래그를 사용하면 하위 디렉토리들을 한 번에 생성할 수 있다 (예:mkdir -p movies/2004/
).cp [원본_파일] [대상_파일]
또는cp -r [원본_디렉토리] [대상_디렉토리]
: 파일을 복사하거나,-r
플래그를 사용하여 디렉토리와 그 내용을 재귀적으로 복사한다.rm [파일_이름]
또는rm -r [디렉토리_이름]
또는rm -rf [디렉토리_이름]
: 파일을 삭제한다. 디렉토리를 삭제할 때는-r
플래그를 사용하며, 내용이 있는 디렉토리를 강제로 삭제할 때는-rf
플래그를 사용해야 한다. 주의:rm -rf
명령어는 매우 강력하며, 잘못 사용하면 중요한 데이터를 영구적으로 삭제할 수 있으므로 신중하게 사용해야 한다.rm -i [파일_이름]
명령어를 사용하면 삭제 전에 확인 메시지를 표시하여 실수를 방지할 수 있다.mv [원본_파일] [대상_파일]
또는mv [원본_파일] [대상_디렉토리]
또는mv [기존_이름] [새_이름]
: 파일을 이동하거나 이름을 변경한다.touch [파일_이름]
: 파일의 접근 시간 및 수정 시간을 현재 시간으로 업데이트하거나, 존재하지 않는 경우 빈 파일을 생성한다.cat [파일_이름]
: 파일의 내용을 터미널에 출력한다. 짧은 파일의 내용을 빠르게 확인하는 데 유용하다.head -n [숫자] [파일_이름]
: 지정된 파일의 처음[숫자]
줄을 출력한다.-n
옵션을 생략하면 기본적으로 처음 10줄이 출력된다.tail -n [숫자] [파일_이름]
: 지정된 파일의 마지막[숫자]
줄을 출력한다. 로그 파일의 최근 내용을 확인하는 데 자주 사용된다.-n
옵션을 생략하면 기본적으로 마지막 10줄이 출력된다.man [명령어]
: 지정된 명령어의 매뉴얼 페이지를 표시한다. 명령어의 사용법, 옵션, 예제 등을 자세히 확인할 수 있다.man man
명령어를 통해man
명령어 자체에 대한 매뉴얼을 볼 수도 있다.
표준 입출력 (Stdin, Stdout)과 리디렉션
대부분의 리눅스 프로그램은 표준 입력(Standard Input, stdin), 표준 출력(Standard Output, stdout), 그리고 표준 에러(Standard Error, stderr)라는 세 가지 표준 스트림을 사용한다.
- 표준 입력 (stdin): 프로그램이 데이터를 읽어들이는 기본 통로이다. 기본적으로 키보드로부터 입력을 받는다.
- 표준 출력 (stdout): 프로그램이 정상적인 결과를 출력하는 기본 통로이다. 기본적으로 터미널 화면에 출력된다.
- 표준 에러 (stderr): 프로그램 실행 중 발생하는 오류 메시지를 출력하는 기본 통로이다. 기본적으로 터미널 화면에 출력된다.
리디렉션(Redirection)은 이러한 표준 스트림의 방향을 변경하는 기능이다. 이를 통해 프로그램의 입력을 파일로부터 받거나, 프로그램의 출력을 파일로 저장할 수 있다.
-
>
(출력 리디렉션): 명령어의 표준 출력(stdout)을 지정된 파일로 보낸다. 만약 해당 파일이 존재하지 않으면 새로 생성하며, 이미 존재한다면 내용을 덮어쓴다.Bashls -l > file_list.txt
위 명령어는
ls -l
명령어의 결과를 터미널 대신file_list.txt
파일에 저장한다.
-
>>
(출력 추가 리디렉션): 명령어의 표준 출력(stdout)을 지정된 파일의 기존 내용 뒤에 추가한다. 파일이 존재하지 않으면 새로 생성한다.Bashecho "새로운 내용" >> file_list.txt
위 명령어는 "새로운 내용"이라는 문자열을
file_list.txt
파일의 끝에 추가한다. -
<
(입력 리디렉션): 파일의 내용을 명령어의 표준 입력(stdin)으로 사용한다.Bashgrep "특정_문자열" < input.txt
위 명령어는
input.txt
파일의 내용을grep
명령어의 입력으로 사용하여 "특정_문자열"을 포함하는 줄을 찾는다.
파이프 (Pipe)
파이프(|)는 하나의 명령어의 표준 출력(stdout)을 다른 명령어의 표준 입력(stdin)으로 연결하는 유용한 메커니즘이다. 이를 통해 여러 개의 간단한 명령어를 조합하여 복잡한 데이터 처리 작업을 효율적으로 수행할 수 있다.
cat large_log_file.txt | grep "error"
위 명령어는 cat
명령어를 사용하여 large_log_file.txt
파일의 내용을 출력하고, 이 출력을 파이프를 통해 grep
명령어의 입력으로 전달한다. grep
명령어는 입력받은 내용 중에서 "error"라는 문자열을 포함하는 줄만 출력한다.
파이프는 여러 단계를 거치는 데이터 처리 흐름을 간결하게 표현할 수 있도록 해준다. 예를 들어, 현재 디렉토리의 모든 .txt
파일 중에서 "important"라는 단어를 포함하는 파일의 이름만 출력하고 싶다면 다음과 같이 명령어를 조합할 수 있다.
ls *.txt | xargs -n 1 grep -l "important"
여기서 ls *.txt
는 확장자가 .txt
인 모든 파일을 나열하고, xargs -n 1
은 각 파일 이름을 개별적인 인수로 만들어 grep -l "important"
명령어에 전달한다. grep -l
옵션은 패턴을 포함하는 파일의 이름만 출력한다.
또 다른 예시로, 특정 프로세스의 ID(PID)를 찾아서 해당 프로세스를 종료하는 작업을 파이프를 통해 자동화할 수 있다.
ps aux | grep "my_program" | awk '{print $2}' | xargs kill
이 명령어는 다음과 같은 단계를 거친다:
ps aux
: 현재 실행 중인 모든 프로세스의 상세 정보를 출력한다.grep "my_program"
:ps aux
의 출력 중에서 "my_program"이라는 문자열을 포함하는 줄만 필터링한다.awk '{print $2}'
: 필터링된 각 줄에서 두 번째 필드(PID)를 추출한다. (awk
는 유용한 텍스트 처리 도구이다.)xargs kill
: 추출된 PID들을kill
명령어의 인자로 전달하여 해당 프로세스를 종료한다.
결론
이 포스트에서는 리눅스 환경에서 기본적인 명령어 사용법, 표준 입출력과 리디렉션의 개념, 그리고 파이프를 활용한 데이터 처리 방법에 대해 상세히 알아보았다. 이러한 기본적인 이해는 앞으로 리눅스 시스템을 더욱 효과적으로 활용하고, 복잡한 작업들을 자동화하며, 시스템 프로그래밍 학습 및 연구 개발 환경에서 생산성을 높이는 데 필수적인 기반이 될 것이다. 끊임없는 학습과 실습을 통해 리눅스 환경에 더욱 익숙해지는 것이 중요하다. 궁금한 점이나 더 알고 싶은 명령어가 있다면 언제든지 추가로 학습해야겠다.
추천글:
[시스템프로그래밍] System Program - Compilation System, Runtime System, Operation System
[Linux] terminator 실행 오류 해결법
[Research] Carla 환경 설정 (server: window + client: ubuntu)