리눅스 마스터 공부를 위한 핵심 정리 중 오늘은 리눅스 셸(Shell)에 대해서 리눅스 마스터 교재와 최대한 비슷하도록 느낌을 살려봤고 간단한 쉘 스크립트 실습 코드를 포함하고 있습니다.
셸(Shell) 이란?
셸(Shell)은 리눅스 운영 체제의 핵심 구성 요소 중 하나로, 사용자와 커널(운영 체제의 핵심 부분) 사이의 인터페이스 역할을 합니다. 사용자가 명령어를 입력하고 시스템 리소스에 액세스 하고 파일을 관리하는 데 사용하는 환경을 제공합니다.
좀 더 면밀히 살펴보면 아래와 같은 역할로 설명할 수 있습니다.
- 사용자와 커널 간 중간 역할: Bash는 사용자와 커널 사이에서 중간 역할을 합니다. 사용자가 명령을 입력하면 Bash는 그 명령을 커널이 이해할 수 있는 방식으로 변환하고 커널에 전달합니다.
- 명령어 해석기: Bash는 입력된 명령어를 이해하고 실행 가능한 형식으로 해석합니다. 예를 들어, "ls"라는 명령을 받으면 Bash는 이것이 파일 목록을 표시하는 명령임을 이해합니다.
- 사용자가 입력한 명령 해석: 사용자가 입력한 명령을 Bash가 해석하면, Bash는 해당 명령을 실행 가능한 형태로 만들기 위해 필요한 모든 정보를 준비합니다.
- 커널에 명령 전달: Bash는 사용자가 입력한 명령을 커널에 전달합니다. 커널은 이 명령을 받아들이고 명령에 따라 시스템 리소스 및 파일 등을 관리하거나 작업을 수행합니다.
예시로 bash쉘을 사용하여 시나리오로 보여드리겠습니다
현재 내가 쓰고 있는 쉘 살펴보기
#현재 내가 쓰고있는 쉘
echo $SHELL
#내 시스템에서 현재 지원하는 셸 목록 확인
chsh -l
#cat 명령어로 확인하기
cat /etc/shells
#셀 변경해보기
chsh -s /bin/sh
#특정 유저의 쉘 확인하기
cat /etc/passwd | grep 확인하려는 유저이름
셸(Shell)의 주요 특징
셸은 다음과 같은 주요 특징을 가지고 있습니다:
- 명령어 인터프리터: 리눅스 셸은 사용자가 명령어를 입력하면 해당 명령어를 해석하고 실행하는 역할을 합니다.
- 스크립트 지원: 셸 스크립트를 작성하여 반복 작업을 자동화하고 작업을 효율적으로 처리할 수 있습니다.
- 파이프라인: 여러 명령어를 연결하여 데이터 처리 파이프라인을 생성할 수 있으며, 이를 통해 데이터를 효과적으로 가공할 수 있습니다.
- 환경 변수 관리: 셸은 환경 변수를 설정하고 관리하여 시스템 동작을 사용자 정의할 수 있는 기능을 제공합니다.
셸(Shell)의 종류
리눅스 셸은 여러 가지 다른 종류로 나눌 수 있습니다. 주요한 리눅스 셸의 종류는 다음과 같습니다: ( 리눅스마스터 2급 2020년 3회 2차 기출문제로 출제된 적이 있네요)
본 셸 계열 (Bourne Shell 계열):
1.Bash (Bourne-Again Shell): 가장 널리 사용되며, 리눅스와 macOS에서 기본 셸로 제공됩니다. 강력한 스크립트 지원과 다양한 기능을 제공합니다. 대부분의 리눅스 시스템에서 표준 셸로 사용됩니다.
2.Dash (Debian Almquist Shell): 리눅스 배포판 중 일부에서 기본 셸로 사용되는 경량의 Bourne 셸 계열입니다. 주로 시스템 초기화 스크립트에서 사용됩니다.
3.ASH (Almquist Shell): 다양한 임베디드 시스템 및 리눅스 배포판에서 사용되는 경량 셸입니다.
C 셸 계열 (C Shell 계열):
1.Csh (C Shell): 유닉스 계열 운영 체제에서 사용되는 셸로, C 프로그래밍 언어와 유사한 문법을 사용합니다. 히스토리 기능 및 자동 완성을 포함한 다양한 기능을 제공합니다.
2.Tcsh (Tenex C Shell): Csh를 확장하여 추가 기능을 제공하는 셸로, 명령어 히스토리와 자동 완성을 개선했습니다.
본 셸 계열은 다양한 유닉스 및 리눅스 시스템에서 사용되며, 각각의 셸은 특정한 운영 체제나 환경에서 유용하게 사용됩니다. 이러한 셸든은 스크립트 작성, 시스템 관리, 명령어 처리 등 다양한 작업에 활용됩니다.
로그인 셸(login shell)
로그인 셸은 사용자가 시스템에 로그인할 때 실행되는 기본 셸입니다. 사용자의 기본 로그인 셸은 /etc/passwd 파일에서 설정됩니다. 예를 들어서 ssh로 접속한다거나 원격접속을 할 때 id 비밀번호를 입력하는데 로그인 성공 시 사용되는 쉘을 로그인 쉘이라 합니다)
비로그인 셸(Non-Login-Shell)
비로그인 셸은 로그인 없이 실행되며, 보통 스크립트나 작업을 자동화하는 데 사용(터미널에서 쉘 스크립트를 실행했을 경우, gui 화면에서 터미널 아이콘, 단축키로 터미널을 열었을 경우 비로그인 셸이 실행됩니다),
인터랙티브 셸(Interactive Shell)
인터랙티브 셸은 사용자와 상호 작용하는 데 사용됩니다. 사용자가 명령을 입력하고 결과를 볼 수 있습니다.
ls 명령어를 치면 결과를 볼 수 있죠, cd , pwd , whoami 등등 해당됩니다.
인터렉티브 셸에서 사용되는 주요 파일:
- ~/. bashrc (또는 ~/. bash_profile): 인터렉티브 bash 셸에서 사용자별로 설정을 정의하는 파일입니다. 사용자 환경 변수, 사용자 정의 명령어, 에일리어스(별칭) 등을 설정합니다.
- ~/. bash_history: 이 파일에는 사용자가 입력한 명령어 히스토리가 저장됩니다. 이전에 입력한 명령어를 활용할 때 유용합니다.
- ~/. bash_logout: 로그아웃할 때 실행되는 bash 셸의 설정 파일입니다. 사용자 환경을 종료하고 정리하는 작업을 수행합니다.
비인터랙티브 셸(Non-Interactive Shell)
비인터랙티브 셸은 대개 스크립트나 배치 작업을 실행하는 데 사용됩니다. 사용자와의 상호 작용이 없습니다.(셸 스크립트가 해당됩니다)
비인터렉티브 셸에서 사용되는 주요 파일:
- /etc/bash.bashrc (또는 /etc/bashrc): 비인터렉티브 bash 셸의 시스템 전역 설정 파일입니다. 시스템 전반적인 환경 변수와 설정을 정의합니다.
- /etc/skel: 새 사용자 계정을 생성할 때 이 디렉터리의 내용이 사용자의 홈 디렉터리로 복사됩니다. 이 디렉터리에는 사용자별로 초기 환경 설정 파일이 포함되어 있습니다.
- /etc/profile: 로그인할 때 시스템 전역으로 실행되는 스크립트 파일로, 모든 셸 유형에서 사용됩니다. 시스템 전반적인 환경 설정 및 초기화 작업을 수행합니다.
중요
추가적으로 쉘 스크립트의 가장 첫 줄에 #!/bin/bash /bin/sh처럼 작성하는데요 sh bash처럼 셸의 종류를 지정하려고 저 렇게 맨 위에 항상 표기해요! 그래서 sh 쉘스크립트파일명 을 해도 실행이 안될 때가 있을 거예요 그 이유가 바로 여기서 나온답니다.
리눅스 셸(Shell) 의 설정파일
시스템 전역 설정 파일 (공통):
- /etc/profile: 시스템 전역으로 작동하는 파일로, 모든 셸 유형에서 공통적으로 실행됩니다. 초기 시스템 환경 변수와 경로 설정, 공통 함수 등을 정의합니다.
Bash 셸에서 사용되는 설정 파일:
- /etc/bash.bashrc (또는 /etc/bashrc): Bash 셸에서 시스템 전역 설정 파일입니다. 모든 사용자에게 공통으로 적용되며, 초기 환경 변수 설정, 시스템 레벨의 셸 설정을 포함합니다.
- ~/. bashrc (또는 ~/. bash_profile): Bash 셸에서 사용자별로 작동하는 설정 파일입니다. 각 사용자의 홈 디렉터리에 위치하며, 사용자 환경 변수, 사용자 정의 명령어, 에일리어스(별칭) 등을 설정합니다. 이 파일은 각 사용자마다 다를 수 있습니다.
- ~/. bash_history: 이 파일에는 사용자가 입력한 명령어 히스토리가 저장됩니다. 이전에 입력한 명령어를 활용할 때 유용합니다.
- ~/. bash_logout: 로그아웃할 때 실행되는 bash 셸의 설정 파일입니다. 사용자 환경을 종료하고 정리하는 작업을 수행합니다.
# '~'이 표시는 root를 표현하는 게 아니라 현재 로그인 한 유저 기준에 디렉터리 폴더를 뜻합니다
실무에서 사용되는 alias 기초 실습 예제
alias 란?
쉘에서 "alias"는 명령어나 명령어 시퀀스를 간단한 단어나 축약어로 정의하여 사용하는 기능입니다. 이를 통해 자주 사용하는 명령어나 복잡한 명령어 시퀀스를 간편하게 실행할 수 있습니다. 아래는 Bash에서 alias를 사용하는 방법과 예제입니다.
alias 만들기:
alias 명령어를 사용하여 새로운 alias를 만듭니다. 일반적인 구문은 다음과 같습니다:
alias 만들고싶은단축명령어이름='cat /etc/passwd'
alias 만들고싶은단축명령어이름='sudo systemctl start sshd 또는 ssh'
alias는 현업에서도 많이 쓰는 것 같아요 ( 정말 수직적인 문화를 가진 기관은 제외)
alias + 인자 값 사용 예제
alias greet='echo hello'
alias 명령어 예제
alias update='sudo apt update && sudo apt upgrade'
alias 삭제:
unalias 명령어를 사용하여 alias를 삭제할 수 있습니다. 예를 들어:
unalias update
#추가적으로 alias 에 리스트는 alias 명령어만 치면 확인가능합니다
명령어 치환 기능 (Command substitution)
명령어 치환은 쉘 스크립트나 명령어 실행 중에 결과를 변수에 저장하거나 다른 명령어에 전달하기 위해 명령어 실행의 결과를 변수에 할당하는 기능을 말합니다. Bash 쉘에서는 명령어 치환을 위해 두 가지 주요 방법을 사용할 수 있습니다.
#나름 옳지 않은 것을 고르세요에서 나올 수 있는 헷갈리는 기능이에요 한 번씩 꼭 해보세요
- 명령어 치환 방법:
- 역따옴표(Backticks) 사용:
- 명령어 실행의 결과를 변수에 저장하려면 역따옴표 (``)를 사용할 수 있습니다.
이렇게 하면 "ls -l" 명령어의 결과가 result 변수에 저장됩니다.
result=`ls -l`
- $() 사용:
- 결과는 동일하게 result 변수에 저장됩니다.
- 역따옴표 대신 $() 구문을 사용하여 명령어 치환을 수행할 수도 있습니다. 위의 예제를 $()를 사용하여 다음과 같이 작성할 수 있습니다:
result=$(ls -l)
파일 카운트 예제:
file_count=$(ls -1 | wc -l)
echo "현재 디렉터리에는 $file_count개의 파일이 있습니다."
날짜 및 시간 예제:
현재 날짜와 시간을 변수에 저장하는 예제:
current_datetime=$(date "+%Y-%m-%d %H:%M:%S")
echo "현재 날짜와 시간은 $current_datetime 입니다."
응용 편 명령어 실행 결과를 다른 명령어에 전달하는 예제:
명령어 치환을 사용하여 다른 명령어에 값을 전달할 수 있습니다. 예를 들어, 특정 파일에서 특정 문자열을 검색하려면 다음과 같이 할 수 있습니다:
filename="example.txt"
search_string="키워드"
result=$(grep "$search_string" "$filename")
echo "$result"
이렇게 하면 "example.txt" 파일에서 "키워드"를 검색한 결과가 result 변수에 저장되고 출력됩니다.
#실습 편
#이전 편
#처음부터 보기
결론
리눅스 셸은 리눅스 시스템에서 핵심적인 역할을 하는 도구 중 하나입니다. 이해하고 주요 특징 및 종류에 대한 지식을 갖는 것은 리눅스 시스템을 효과적으로 관리하고 사용하는 데 필수적입니다. 만약 리눅스 환경에서 작업하는 중이라면, 셸에 대한 이해는 중요한 역할을 할 것입니다
'리눅스 > 리눅스마스터1급' 카테고리의 다른 글
[리눅스마스터1급] 핵심 내용 정리 : X 윈도우 (X window) (42) | 2023.09.06 |
---|---|
[리눅스마스터1급] 핵심 내용 정리 : 파일 시스템 구조 (24) | 2023.09.05 |
[리눅스마스터1급] 핵심 내용 정리 : 부팅의 절차 & (systemd,init) (33) | 2023.09.03 |
[리눅스마스터1급] 핵심 내용 정리:부트 매니저 (boot manager) 에 모든것 (20) | 2023.09.02 |
[리눅스마스터1급] 핵심 내용 정리: 디스크 인터페이스 & LVM (20) | 2023.09.02 |