#ls #cd #sudo #vi #vim #bash #zsh #chsh #.bashrc #zshrc #source #.profile #chmod #chown #ln
1. Shell 이란?
운영 체제에서 *커널과 사용자 사이에 끼어서 사용자의 명령을 해석하고 그 처리 결과를 뿌려주는/프로그램을 실행하는 시스템 프로그램.
= 사용자가 OS와 상호 작용할 수 있도록 하는 명령줄 인터페이스. 쉘은 사용자의 입력을 읽고 명령을 해석하고 실행한다.
Shell(소라/조개 껍데기): 내부의 커널과 이용자는 이를 감싸는 껍데기에 접근
*커널?
커널
OS의 핵심. 커널이 날아가면 OS를 못 쓰게 된다 역할: 자원 관리(하드웨어의 자원을 필요한 프로세스에 분배), 보안, 추상화(하드웨어에 직접 접근하지 않게 운영 체제의 복잡한 내부를 숨기고 깔끔하고 일관성 있는 인터페이스를 하드웨어에 제공하기 위해 몇 가지 하드웨어 추상화를 구현함.) 현재 대부분의 OS는 커널 위에 여러 소프트웨어 계층을 올린 것이다.
사용자가 하드웨어를 조작하는 과정
- 사용자(명령 입력) → 셸(해석) → 커널(명령 수행 후 결과 전송) → 셸(해석) → 사용자(결과 확인)
Shell의 기능
- 명령어 해석기 기능: 사용자와 커널 사이에서 명령을 해석해 전달
- 프로그래밍 기능: 셸 프로그래밍 기능을 이용하면 여러 명령을 사용해 반복적으로 수행하는 작업을 하나의 프로그램으로 만들 수 있다. 셸 프로그램을 셸 스크립트라고 부른다.
- 사용자 환경 설정 기능: 초기화 파일 기능을 이용해 사용자의 환경을 설정할 수 있다. 로그인할 때 이 초기화 파일이 실행되어서 사용자의 초기 환경이 설정된다.
Shell의 종류
운영 체제 상에서 다양한 운영 체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램이다. 일반적으로 명령 줄 셸과 그래픽 셸로 구분된다. 명령 줄 셸: OS에서 명령 줄 인터페이스(CLI)를 제공, 그래픽 셸: 그래픽 사용자 인터페이스(GUI)를 제공
CLI는 사용자가 입력하는 문자열을 이해하고 컴퓨터와 사용자의 원활한 통신을 위한 Shell이라는 명령어 해석 프로그램을 통해 컴퓨터를 조작할 수 있다. 글자를 입력하여 컴퓨터에 명령을 내리는 방식. ex. cmd, bash macOS의 GUI는 Finder, 윈도우의 GUI는 Windows 탐색기
- 명령줄 셸 / CLI 셸
- Bourne Shell 계열
- Bourne Shell (sh)
- 1974년 Stephen Bourne이 개발한 최초의 셸이다.
- 대부분의 리눅스에 기본적으로 설치되어있다.(’/bin/sh’)
- 많은 셸의 기반이 되는 셸이다.
- 스크립트를 지원 - Korn Shell (ksh)
- 유닉스에서 가장 많이 사용되는 Bourne Shell을 확장한 셸
- /bin/ksh
- 명령어 완성 기능, 히스토리 기능 지원 - Bourne Again Shell (#bash)
- Linux 표준 셸로 채택. 리눅스에서 가장 많이 사용하는 셸이다.
- 본셸을 기반으로 GNU 프로젝트를 위해 Brian Fox가 작성한 셸이다.
- csh와 ksh의 장점을 결합하여 작성되었다.
- /bin/bash
- Linux, macOS X 등 다양한 OS에서 사용된다.
- 명령어 완성 기능, 히스토리, 명령어 치환, 편집 등을 지원 - Z Shell (#zsh)
- 확장형 본셸, 콘셸의 재작성 셸이다.
- /bin/zsh
- 강력한 히스토리 기능
- 향상된 명령행 편집 기능
- Bourne Shell (sh)
- C 계열
- C Shell (csh)
본셸의 사용성을 높인 셸이다.
/bin/csh
C언어의 특징을 많이 포함한다.
히스토리, 별명, 작업 제어 등의 기능을 포함. - TC Shell (tcsh)
csh의 기능을 강화한 셸
bin/tcsh
확장 C셸로, BSD 계열에서 가장 많이 사용한다.
명령어 편집 기능 제공
- C Shell (csh)
- Bourne Shell 계열
- 그래픽 셸 / GUI 셸
- 마이크로소프트 환경
- Windows 탐색기
- 마이크로소프트 환경
Shell의 시작 파일
shell이 시작되면 시작 파일이 시행된다. 시작 파일은 일련의 스크립트이며 모든 사용자들에게 적용되는 환경설정 값을 세팅한다.
- Login Shell
사용자가 로그인했을 때 적용되는 쉘을 의미한다.
ssh로 로그인하거나 GUI에서 로그인하는 경우 여기에 해당된다. - Non-login Shell
로그인 없이 실행되는 쉘을 의미한다.
ssh로 접속하고 나서 bash를 다시 실행하는 경우, GUI에서 터미널을 새로 띄우는 경우 등 여기에 해당한다.
다음은 셸 환경을 구축하는 파일이다.
- #.profile
Login Shell이 시작될 때 자동으로 실행되며, 사용자의 환경 변수, PATH 등의 기본적인 환경 설정을 구성하는 데 사용된다. - #.bashrc
Bash 셸에서 사용자 지정 구성 요소를 정의하는 데 사용된다. Bash 셸이 시작될 때 자동으로 로드된다. - #.zshrc
Zsh 셸에서 사용자 지정 구성 요소를 정의하는 데 사용된다. Zsh 셸이 시작될 때 자동으로 로드된다.
Shell Script란?
Shell 명령어들을 텍스트 파일이 모아서 실행해주는 것.
파이썬처럼 코드를 위에서 아래로 순차적으로 실행하는데, 이 때 실행하는 명령어들이 Shell이라는 차이가 있다.
Shell에게 무슨 명령을 실행할지 알려주는 스크립트 파일.
컴파일이 필요없이 리눅스 환경에서 셸을 인터프리터로 바로 해석해서 실행함.
셸이 일련의 명령을 스크립트에 적힌 순서대로 실행하도록 하는 텍스트 파일.
가장 많이 사용되는 bash를 기준으로 설명한다.
Shell Script 기본 문법
- 최상단 필수 구문
Script 최상단에는 #!/bin/bash 이 항상 적혀있어야 한다.
다른 셸을 사용하는 경우 다른 셸을 명시할 수 있다.
다음은 Hello, World를 출력하는 기본 예시이다.
#!/bin/bash
echo "Hello, world"
printf "Hello, world"
스크립트 첫 라인의 #는 주석 기호가 아니다.
사용하려는 명령어 해석기가 bash 셸임을 미리 알려주는 것이다.
#!: 매직 코드. 실행 가능한 셸 스크립트라는 것을 나타내는 특별한 표시자
bin/bash: 경로명, 스크립트에 들어있는 명령어들을 해석할 프로그램의 위치를 나타냄.
- 주석
#! 같이 # 뒤에 붙어서 사용하는 명령들이 있으므로 띄어쓴다.
- 출력
echo "Hello, world"
printf "Hello, world"
printf "%s, %s" Hello, world
- 입력
read NAME
echo "Hello, $NAME"
- 변수
’변수명=값’으로 변수를 선언하고(변수명과 값 사이에 공백이 있으면 안 된다.) 사용할 때는 앞에 $를 붙여준다.
혹은 ${변수}로 중괄호로 묶어서 사용한다.
a="Hello"
b="world"
echo "${a}, ${b}"
printf "%s, %s" $a, $b
Shell Script 명령어
- #ls
현재 디렉토리에서의 파일 리스트를 출력한다.
ls # 인자를 주지 않으면 현재 작업 디렉토리의 파일 리스트를 출력한다.
ls -a # 경로 안의 모든 파일을 출력한다. 숨김파일도 포함.
ls -l # 자세히 출력한다.
ls -r # 출력 결과를 내림차순으로 정렬한다.
ls -t # 파일이 수정된 시간을 기준으로 정렬한다.
# 여러개 옵션을 한 번에 줄 수도 있다.
ls -al # 숨김파일도 포함하여 목록을 자세히 출력한다.
- #cd
워킹 디렉토리를 바꾼다.
cd [path]
cd .. # parent directory로 이동
cd ~ # HOME로 이동
- #ln
*링크 파일을 만든다.
*링크?
더보기링크
링크 생성을 통해 편리하게 파일과 디렉토리를 관라할 수 있다.
1. Hard Link
- 원본의 복사본을 사용하기 때문에 원본이 삭제되어도 사용 가능하다.
- 기존의 유닉스 방식이다.
2. Symbolic Link
- 원본이 삭제되면 링크를 사용할 수 없다. 바로가기 기능과 유사한 것.
- 좀 더 최근의 방식이며, 최근에는 심볼릭 링크를 더 선호한다.
3. 언제 링크 명령어를 쓰는가?
- 매우 긴 파일명이 있을 때 사용자가 이 파일을 자주 참조하거나 이 파일을 다른 디렉토리에 연결하여 그
디렉토리에서도 사용하려고 할 때.
- 파일의 경로명을 모두 입력하지 않고 파일명만을 입력하여 파일을 사용하려고 할 때.
# 하드 링크 만들기
ln TARGET[원본] LINK_NAME[링크이름]
# 심볼릭 링크 만들기
ln -s TARGET[원본] LINK_NAME[링크이름]
- #chsh
사용하고 있는 셸을 바꾼다.
chsh [option] /bin/dash [사용자 이름]
- #sudo substitude user do
리눅스에서 현재 접속한 계정과 다른 계정에서 작업을 처리해야 할 때 사용한다.
리눅스 머신에 명령어를 설치할 때 많이 사용된다.
# jq 명령어 설치
sudo yum install jq
cf) su substitude user
명령어만 실행하는 명령어인 sudo와 달리 sudo는 다른 계정으로 변경할 때 사용한다.
- #chmod change mode
리눅스에서 파일을 사용해 할 수 있는 작업의 모드는 세 가지이다.- r = read: 파일에 저장된 데이터 읽기.
- w = write: 파일에 데이터 쓰기.
- x = execute: 파일 실행하기
chmod는 이러한 파일의 권한을 변경할 수 있도록 한다.
chmod [option] [mode] [file]
- #chown change owner
파일이나 디렉터리의 소유자를 변경하는 명령어이다.
chown user [경로]
- #source 파일을 실행하는 명령어이다. .와 동일한 기능을 한다.
source [파일]
. [파일]
#vi (Visual Editor)
visual editor는 리눅스에서 파일을 편집하기 위한 것으로, 윈도우의 메모장과 유사하다.
쉘 스크립트를 작성할 때 vi editor를 통해서 작성할 수 있다.
셸 상에서 vi [파일명]을 입력하면 새로운 문서를 편집할 수 있는 환경이 만들어진다.
vi의 모드는 세 가지이다.
- 명령 모드 Command Mode
vi를 시작하자마자 접하게 되는 모드이다.
커서의 이동, 수정, 삭제, 복사, 붙이기, 탐색 등이 가능하다.
글자 입력은 불가능하다.
명령 모드로 다시 전환하려면 Esc 키를 누르면 된다. - 입력 모드 Insert Mode/Input Mode
글자를 입력하는 문서를 만드는 모드이다.
명령 모드에서 모드 전환키인 i, a, o 등을 입력하면 입력 모드로 전환된다.
입력 모드로 전환하면 화면 아래에 ‘--INSERT--’가 표시된다. - ex 명령 모드
명령 모드에서 :를 입력하면 전환된다.
저장, 종료, 탐색, 치환, vi 환경 설정 등이 가능하다.
#vim (vi Improved)
vi와 호환되는 문서 편집기이다.
터미널 환경에서 사용하는 vi는 보통 vim인 경우가 많다.
리눅스와 유닉스 배포판에는 기본적으로 vim을 vi로 alias해 두었다.
vi는 텍스트 편집에 필요한 최소한의 기능만 가지고 있어서 사용하기 불편한 반면, vim은 vi를 개량하여 문법 강조 기능 등 기능들이 많이 추가되어 편리하다.
Reference
https://raonctf.com/essential/study/web/interface_shell
https://jhnyang.tistory.com/entry/리눅스셸Shell이란-셸의-변경-쉘-개념-기능-종류와-특징sh-bash-csh-tcsh-ksh
https://www.geeksforgeeks.org/difference-between-cli-and-gui/
https://hanamon.kr/터미널-콘솔-쉘-명령줄terminal-console-shell-command-line의-차이-2/
https://mjmjmj98.tistory.com/34
https://scribblinganything.tistory.com/584
https://velog.io/@naneun/Linux-쉘Shell이란
https://egg-programmer.netlify.app/blog/Shell-Script-명령어-정리
https://eunguru.tistory.com/90
https://dev-jwblog.tistory.com/18
https://jhnyang.tistory.com/54
https://velog.io/@zeesoo/Linux-vi-편집기-사용법-및-명령어
https://blockdmask.tistory.com/25 — vi 실제 사용 예
'CS' 카테고리의 다른 글
[Git] Git 개념과 기초 (2) | 2023.04.16 |
---|