CLI관점에서 리눅스와 상호 작용하는 방법은 두 가지가 있다.
첫 번째 방법은 수동이다.
즉 사 용자가 터미널 앞에 앉아 대화식으로 명령을 입력하고 출력값을 받는 것이다. 이런 즉흥적인 상호 작용은 다음과 같이 매일 셸에서 수행하는 대부분의 작업에 해당한다.
- 디렉터리 몰록 출력, 파일 찾기, 파일 내부 내용 찾기
- 디렉터리 간 혹은 원격 시스템 간 파일 복사
- 이메일이나 뉴스를 읽거나 터미널에서 트윗 보내기
두 번째 방법은 셸이 해석하고 차례로 실행할 수 있는 특수한 종류의 파일에 있는 일련의 명령을 자동으로 처리하는 것이다.
이 모드를 일컬어 흔히 셸 스크립팅 또는 그냥 스클립팅 이라고 한다.
▪️터미널
터미널, 또는 터미널 에뮤레이터, 또는 소프트 터미널로 불린다.
터미널은 텍스트로 된 사용자 인터페이스(UI)를 제공하는 프로그램이다. 즉 터미널은 키보드에서 문자를 읽어 화면에 표시하는 기능을 지원한다. 기본적인 문자 중심의 입려과 출력 외에도 터미널은 커서, 화면 처리, 그리고 잠재적으로 색상 지원이 가능하도록 이스케이프 시퀀스 또는 이스케이프 코드를 지원한다. 예를 들어 Ctrl+H를 누르면 백스페이스가 실행되어 커서 왼쪽에 있는 문자가 삭제된다.
▪️셸
터미널 내부에서 실행되며 명령 ①인터프리터 역할을 하는 프로그램이다. 셸은 스트림을 통해 입력,출력을 처리하고, 변수를 지원하며, 사용 가능한 내장 명령이 몇 가지 있으며, 명령 실행 및 상태를 처리하고, 일반적으로 대화식 사용과 스크립트 사용을 모두 지원한다.
본셸(sh)이 많이 쓰였지만, 최근에는 배시셸(bash)가 많이 쓰인다.
①명령어 한 줄 입력하면, 그 즉시 읽어서 실행해버리는 방식. 엔터를 치는 순간 셸인터프리터가 그 명령을 해석해서 커널에게 요청한다.
1.스트림
입력과 출력, 줄여서 I/O라고 한다.프로그램에 어떻게 입력을 제공할 수 있을까? 프로그램의 출력값과 터미널이나 파일에 도달하는 위치를 어떻게 제어할까?
먼저, 셸은 입력과 출력을 위한 세 가지 기본 파일 디스크립터를 모든 프로세스에 제공한다.
- stdin(FD 0)
- stdout(FD 1)
- stderr(FD 2)

셸이 제공하는 기본값을 사용하지 않으려면(예: stderr이 화면에 출력되지 않고 파일에 저장하려는경우) 스트림을 재지정 할 수 있다.
// stdout과 stderr을 모두 /dev/null로 재지정해 모든 출력값을 버린다.
$ curl https://example.com &> /dev/null
// 출력값과 상태값을 다른 파일로 재지정한다.
$ curl https://example.com > /tmp/content.txt 2> /tmp/curl-status
- /tmp/content.txt

- /tmp/curl-status

// 대화식으로 값을 입력하고 파일에 저장한다. Ctrl+D를 사용해 캡처를 중지하고 콘텐츠를 저장한다.
$ cat > /tmp/interactive-input.txt
- /tmp/interactvie-input.txt

// stdin에서 값을 읽는 tr 명령을 사용해 모든 단어를 소문자로 만든다.
$ tr < /tmp/curl-status [A-Z] [a-z]

// curl을 사용해 URL을 다운로드하고 stderr에서 출력하는 상태값을 버린다. curl의 stdout값은 -l 옵션을 사용하여 행의 개수를 계산하는 wc의 stdin에 제공된다.
$ curl https://example.com 2> /dev/null | \
wc -l

2.변수
셸과 관련해 자주 접하게 되는 용어가 변수다. 값을 하드코딩하고 싶지 않거나 불가능할 때는 언제든 변수를 사용해 값을 저장하고 변경할 수 있다.
- 리눅스가 노출하는 구성 항목을 처리하려는 경우(예: 셸이 $PATH 변수에 저장된 실행 파일을 찾는 위치). 이는 변수를 읽기/쓰기할 수 있는 일종의 인터페이스다.
- 스크립트에서 사용자에게 값을 대화 형식으로 질문하려는 경우
- 긴 값을 한 번 정의해 입력을 줄이려는 경우(예:HTTP API의 URL).이 사용 사례는 변수를 선언한 후 값을 변경하지 않기 때문에 대략적으로 프로그램 언어의 const값에 해당한다.
변수는 다음과 같이 두 가지 종류로 나뉜다.
2-1.환경변수
셸 전체의 설정. env 명령어로 목록을 나열한다.
2-2.셸 변수
현재 실행 상황에서 유효하다. bash에서 set 명령어로 목록을 나열할 수 있다. 하위 프로세스는 셸 변수를 상속하지 않는다.
bash에서 export 명령어를 사용해 환경변수를 만들 수 있다. 변수의 값에 접근하고 싶을 때는 앞에 $를 붙이고, 변수를 제거하고 싶을 때는 unset을 사용한다.
// MY_VAR이라는 셸 변수를 생성하고 값을 42로 지정한다.
$ MY_VAR=42
// 셸 변수를 나열하고 MY_VAR를 필터링한다.
$ set | grep MY_VAR

// MY_GLOBAL_VAR이라는 새 환경변수를 만든다.
$ export MY_GLOBAL_VAR="fun with vars"
// 셸 변수를 나열하고 MY_로 시작하는 모든 변수를 필터링해본다. 예상대로 이전 단계에서 만든 두 변수가 모두 표시된다.
$ set | grep 'MY_*'
// 환경변수를 나열한다. 예상대로 MY_GLOBAL_VAR이 표시된다.
$ env | grep 'MY_*'


// 새 셸 세션, 즉 MY_VAR를 상속하지 않은 현재 셸 세션의 자식 프로세스를 만든다.
$ zsh (MacOS)
$ bash
// 현재 자식 프로세스에 있기 때문에 셸 변수를 나열하면 MY_GLOBAL_VAR만 나온다.
$ set | grep "MY_*"

3.종료상태
셸은 종료 상태 라고 하는 것을 사용해 명령 실행 완료를 명령 호출자에게 알린다. 일반적으로 리눅스 명령은 종료될 때 상태를 반환한다.
종료 상태값 0은 명령이 오류 없이 성공적으로 실행됐음을 의미하는 반면, 1에서 255 사이의 값은 실패를 나타낸다. 종료 상태를 확인 하려면 echo $?를 사용한다.
4.내장명령어
셸에는 여러 내장 명령어가 있다. 몇 가지 유용한 예로는 yes,echo,cat,read가 있다. help명령어를 사용하면 내장 명령어 목록을 나열할 수 있다. 그러나 그 외 모든 것은 보통 /usr/bin(사용자 명령의 겨우)이나 /usr/sbin(관리 명령의 경우)에 있는 셸 외부 프로그램이라는 점을 기억하자. 실행 파일을 어디에서 찾을지 어떻게 알 수 있을까? 다음과 같은 몇 가지 방법이 있다.
$ which ls

$ type ls

5.작업제어
작업제어는 대부분의 셸이 지원하는 기능이다. 기본적으로 명령을 입력하면 그 명령은 일반적으로 화면과 키보드를 제어하며, 이를 '포어그라운드에서 실행된다'고 한다.
// 명령 끝에 &를 넣으면 백그라운드에서 명령이 실행된다.
$ watch -n 5 "ls" &

// 모든 작업(job)의 목록을 출력한다.
$ jobs

// fg명령을 사용하면 프로세스를 포어그라운드로 가져올 수 있다. watch 명령을 종료하려면 Ctrl+C를 사용한다.
$ fg

▪️일반작업
1.자주 사용하는 명령어 단축하기
인터페이스의 기본 개념 중 한 가지는 가장 자주 사용하는 명령은 빠르게 입력해야 하므로 최소한의 노력만 들여야 한다는 것이다.
나의 경우에는 쿠버네티스의 "kubectl"을 많이 사용하기 때문에, "kubectl" 대신 "k"를 입력한다. 이런 방법을 일컬어 배시 셸에서는 앨리어스라고 부른다.
2.행 탐색과 조작
셸 프롬포트에 명령을 입력할 때는 행을 탐색하거나 행을 조작하는등 다양한 작업을 하곤 한다. 하기의 표는 일반적으로 사용되는 셸의 단축키 목록이다.
| 동작 | 명령어 | 비고 |
| 행의 시작으로 커서 이동 | Ctrl+a | |
| 행의 마지막으로 커서 이동 | Ctrl+e | |
| 커서를 한 문자 앞으로 이동 | Ctrl+f | |
| 커서를 한 문자 뒤로 이동 | Ctrl+b | |
| 커서를 한 단어 앞으로 이동 | Alt+f | 왼쪽 Alt 키에서만 작동 |
| 커서를 한 단어 뒤로 이동 | Alt+b | |
| 현재 문자 삭제 | Ctrl+d | |
| 커서 왼쪽 문자 삭제 | Ctrl+h | |
| 커서 왼쪽 단어 삭제 | Ctrl+w | |
| 커서 오른쪽의 모든 항목 삭제 | Ctrl+k | |
| 커서 왼쪽의 모든 항목 삭제 | Ctrl+u | |
| 화면 지우기 | Ctrl+l | |
| 명령어 취소 | Ctrl+c | |
| 실행 취소 | Ctrl+_ | |
| 기록 검색 | Ctrl+r | |
| 검색 취소 | Ctrl+g |
3.파일 내용 관리
단 한 행의 텍스트를 추가하기 위해 매번 vi 같은 편집기를 실행하고 싶지는 않을 것이다. 또한 가끔은 편집기 사용이 불가능할 때도 있다. 하기는 텍스트 내용을 조작하는 몇 가지 방법이다.
// echo 출력을 재지정해 파일을 생성한다.
$ echo "First line" > ./something

// >> 연산자를 사용해 파일에 한 행을 추가한 후 내용을 확인한다.
$ echo "Second line" >> ./something && \
cat something

// sed를 사용해 파일 내용을 바꾸고 stdout으로 출력한다.
$ sed 's/line/LINE/' ./something

// here 문서를 사용해 파일을 생성한다.
$ cat << 'EOF' > ./another
First line
Second line
Thrid line
EOF

// 생성한 파일의 차이점을 보여준다.
$ diff -y ./something ./another

4.긴 파일 보기
긴 파일, 즉 셸의 한 화면에 표시할 수 없을 만큼 행 수가 많은 파일의 경우 less 또는 bat과 같은 페이저를 사용할 수 있다.페이지 나누기 기능을 활용하면 프로그램은 출력을 분할해서 화면에 나타낼 수 있는 분량에 맞게 페이지를 나눠 표시하고, 각 페이지를 탐색할 수 있는 명령어를 제공한다.
긴 파일을 처리하는 또 다른 방법은 예를들어 처음 몇 행처럼 파일의 선택 영역만 표시하는 것이다. 이럴 때 편리하게 쓸 수 있는 명령은 두 가지가 있다. 바로 head와 tail이다.
$ for i in {1..100} ; do echo $i >> ./longfile ; done
$ head -5 ./longfile

// tail을 이용해 로그의 파일의 마지막을 출력한다. -f 옵션은 따르다(follow)라는 의미로, 결과를 지속적으로 확인하거나 자동 업데이트함을 의미한다.
$ sudo tail -f <log파일등>
5.날짜와 시간 처리
date 명령은 고유한 파일 이름을 생성할 때 유용하다. 유닉스 타임스탬프등 여러 형식으로 날짜를 생성하고 다양한 날짜와 시간 형식 간에 변환할 수도 있다.
// 유닉스 타임스탬프를 생성한다.
$ date +%s

// 유닉스 타임스탬프를 사람이 읽을 수 있는 날짜로 변환한다.
$ date '+%Y/%m/%d %H:%M:%S'

▪️스크립팅
'Linux > モダーンリナックス' 카테고리의 다른 글
| 접근제어 (0) | 2026.05.17 |
|---|---|
| 2.Linux Kernel (5) | 2026.04.25 |
| 1.Linux (1) | 2026.04.25 |