What is Shell?
Shell은 command-line interpreter로, command, 프로그램, shell script을 돌릴 수 있는 인터페이스이다. 쉘은 커널에서 분리된 별도의 프로그램으로 여러 종류가 존재한다. Shell script는 쉘에게 무슨 Unix 커맨드을 실행할 지 알려주는 스크립트 파일이다. shell에 대해 공부해야 하는 이유로는 간단하게 말하면 많이 쓰이기 때문이다. shell command를 사용하는 unix와 linux가 인터넷 서버 시장의 대부분을 차지하고, 윈도우가 아닌 macOS, 우분투, iOS, 안드로이드 등 많은 운영체제가 유닉스를 기반으로 한다.
Shell Command
pwd: 현재 디렉토리 위치를 보여줌
ls: 파일과 디렉토리 리스트를 출력한다.
- ls - 숨김 파일은 표시하지 않음
- ls -a - 숨김 파일까지 전부 보여줌(.으로 시작하는 파일)
- 리스트에서 파일을 실행 시키려면 ./(파일이름)
cd: 디렉토리를 이동할 때 사용한다.
- cd ~ - 사용자의 홈 디렉토리로 이동
- cd . - 현재 디렉토리로 이동(이동 없음)
- cd .. - 한단계 상위 디렉토리로 이동
- cd (경로) - 지정된 경로로 이동
mkdir: 디렉토리를 생성한다. 뒤에 이름을 붙여주면 현재 위치에 이름의 디렉토리를 만들어준다.
rm: 파일이나 디렉토리를 삭제할 때 사용한다.
sudo
- 리눅스는 multi-user system으로 한대의 os에 여러 사용자가 접속해 사용한다. 하지만 종종 일반 사용자의 권한으로는 되지 않는 명령들이 있는데 이럴 때 사용하는 것이 슈퍼 유저의 권한이다. 특히, sudo는 권한만 잠깐 빌려오는 것이라서 명령을 내리는 user는 현재 사용자이다. 따라서 이력이 남는 행동을 할 때 해당 유저의 이름이 남는다
- sudo 명령어를 사용할 때 요구하는 아이디와 비밀번호는 일반 유저의 것이다.(단지, sudo를 사용할 수 있는 user는 sudoers에 포함되어 있어야 한다.)
- 앞에 sudo를 붙이고 뒤에 다른 명령어가 따라온다.
- sudo -s / sudo su - 일시적이 아니라 계속 슈퍼 유저의 권한이 필요하면 root 계정을 반영구적으로 빌릴 수 있다.
- sudo -s는 home 디렉토리가 현재 사용자로, 현재 계정의 환경 변수를 root로 넘긴다.
- sudo su는 home 디렉토리가 /root가 되며 환경 변수를 root 상태로 바꾼다.
Vi & Vim
Vi(visual editor)는 텍스트를 보여줌과 동시에 편집할 수 있는 텍스트 에디터이다. Vim(Vi improved)은 Vi의 업그레이드 버전으로 Vi보다 가독성을 높여주는 등의 기능이 더 추가된 것이라고 보면 된다.
Vi에는 명령모드(command mode), 입력모드(insert mode), 콜론모드 총 3가지 모드가 있다.
- 명령모드(command mode): vi 명령어를 통해 vi를 시작하는 경우 실행되는 모드로 방향키로 커서를 움직인다.
- 입력모드(insert mode): 명령모드에서 i 또는 a키를 통해 입력모드로 넘어가서 코드나 글을 수정하고 esc 키를 통해 다시 돌아간다. space+shift 키를 통해 영/한을 바꿀 수 있다.
- 콜론모드: 명령모드에서 :키를 입력해서 콜론모드를 킬 수 있고 여기서 vi를 종료한다.
- 저장, 종료하기
- :q - 종료하기
- :q! - 저장하지 않고 강제종료
- :w - 저장하기
- :wq - 저장하고 종료하기(ZZ도 같은 기능)
- 커서 이동하기
- w - 다음 단어의 첫글자로 이동
- b - 이전 단어의 첫글자로 이동
- G - 마지막 행으로 가기
- 삭제하기
- x - 커서에 있는 글자 삭제
- X - 커서 앞에 있는 글자 삭제
- dw - 커서를 포함해서 뒤에 있는 단어 삭제
- db - 커서 앞에 있는 단어 삭제
- dd - 커서가 있는 줄 삭제
- 복사하기
- yw - 커서를 포함해서 뒤에 있는 단어 복사
- yb - 커서 앞에 있는 단어 복사
- yy - 커서가 있는 줄 복사
- 붙여넣기
- p - 커서 다음에 붙여넣기
- P - 커서 앞에 붙여넣기
- 찾기
- /(문자열) - 앞에서부터 문자열을 찾기
- ?(문자열) - 뒤에서부터 문자열을 찾기
- n - 뒤로 검색
- N - 앞으로 검색
- 바꾸기
- :%s/old/new - 각 행에 처음 나오는 old를 찾아 new로 바꾸기
- :%s/old/new/g - 모든 old를 new로 바꾸기
- 되돌리기/다시실행
- u - 되돌리기(Undo)
- Ctrl + r - 다시 실행(Redo)
- 기타
- :cd - 현재 디렉토리 출력
Bash vs Zsh
bash는 리눅스의 표준 쉘(shell)로 1989년에 sh쉘 기반으로 만들어졌다. 이전 버전에 비해 스크립팅 언어로서의 기능이 크게 향상되었으며 bash 사용자는 작업 자동화를 위해 프로그램을 작성할 수 있었다. zsh는 bash 등장 직후에 쉘로 똑같이 sh쉘 기반이며, Oh My Zsh라는 온라인 플랫폼을 기반으로 zsh 기반 플러그인과 테마와 같은 확장 기능을 제시했다. 맥에서는 카탈리나부터 zsh를 기본 쉘로 사용하고 있다.
두 쉘이 공통적으로 제공하는 기능은 Z명령(개발자가 자신의 디렉터리를 추적할 수 있게 함), 자동 완성, 자동 보정(오타 수정 등), 색상 사용자 정의 등이 있다. 구별되는 점으로는 zsh는 bash에 비해 사용자가 커스텀하기 용이하며 쉘을 최신 상태를 유지하는 자동 업데이트 기능이 있으며 다양한 툴을 사용하여 높은 확장성을 지닌다는 점에서 유연성이 높다. 반면, bash는 루프 및 조건부 구성, 물결표 및 중괄호 확장, 별칭 사용과 같은 기능들을 가지고 있다. (개인적은 커스텀 때문에 zsh를 사용한다.)
chsh
chsh는 사용자의 로그인 쉘을 변경한다. chsh 명령 실행 시 shell 속성의 현재 값과 사용가능한 쉘 리스트를 표시하고 수정 가능하게 프롬프트를 표시한다. chuser에 대한 권한이 있으면 다른 사용자의 로그인 쉘 또한 변경할 수 있다.
.bashrc & .zshrc
.bashrc나 .zshrc는 로그인 했을 때나 로그인이 되어있다면 터미널을 열 때마다 bash나 zsh가 실행시키는 쉘 스크립트이다. OS를 세팅할 때 bashrc나 zshrc는 CLI나 터미널이 어떻게 구성되고 돌아갈 지를 결정한다. 위에서 설명한 vi를 통해 수정할 수 있다.(하지만 vim 사용을 그렇게 선호하는 편은 아니라 vscode를 주로 이용해 수정한다.(code ~/.zshrc)) 맥os에서는 환경변수 설정 때문에 생각보다는 자주 수정하게 되는 쉘 스크립트이다.
source
bash/zsh의 내장 명령어로 주로 shell의 초기화 파일(~/.bash_profile, ~/.zshrc)을 수정했을 경우 logoff 와 login 을 하지 않고 현재 쉘 세션에 설정을 반영하기 위해서 사용한다. source ~/.zshrc와 같이 파일의 경로를 뒤에 주면 shell 설정를 반영한다.
.profile
로그인할 때마다 로그인 쉘에서 실행되는 스크립트로 현재 로그인한 사용자한테 적용되는 설정이 담겨있다. (bash의 경우 환결설정은 .profile에, alias 설정은 bashrc에 저장하도록 권장된다.)
chmod
먼저, 리눅스에서 파일을 사용해 할 수 있는 작업으로 3가지가 존재한다.
- read - 파일에 저장된 데이터 읽기(r)
- write - 파일에 데이터 쓰기(w)
- execute - 파일 실행(x)
만약 모든 사용자가 리눅스 파일들을 수정할 수 있다고 한다면, 어느 순간 파일들의 데이터들이 달라져있고, 아예 파일이 사라져버릴 수도 있다. 따라서 리눅스에서 각 파일에 대해 read, write, execute에 대한 권한을 각각 설정할 수 있게 되어있다. 이때 가진 권한의 종류에 따라 사용자들은 파일을 소유한 사용자(user), 특정 그룹에 소속된 사용자(group), 그 외 사용자(other)로 분류할 수 있다. 이 3가지 권한과 3가지 사용자에 대한 설정값을 통틀어 모드(mode)라고 한다. 그리고 mode를 변경할 수 있게 만들어주는 명령이 chmod이다. (change mode) 따라서 chmod는 파일의 권한을 변경하는 역할을 한다고 생각하면 된다.
chmod는 chmod (option) (mode) (file) 이렇게 사용하는데,
option의 종류로는,
- -v - 모든 파일에 대해 모드가 적용되는 진단 메시지 출력
- -f - 에러 메시지를 출력하지 않음
- -c - 기존 파일 메시지가 변경되는 경우에만 진단 메시지 출력
- -R - 지정한 모드를 파일과 디렉토리에 재귀적으로 적용
mode의 종류로는,
- u, g, o, a - 소유자(u), 그룹(g), 그 외 사용자(o), 모두(a)
- +, -, = - 현재 모드에 대해 권한 추가(+), 제거(-), 지정(=)
- r, w, x - 읽기 권한, 쓰기 권한, 실행 권한
- s - 실행 시 사용자 또는 그룹 지정(setuid, setgid)
이 있다. 이 mode들을 사용자 - 권한변경 - 권한 순으로 배치하면 된다. 예를 들어, 파일을 소유한 사용자에 대해 읽고 쓸 수 있는 권한을 지정하려면, (mode) 자리에 들어가야 할 것이 u=rw이 될 것이다. 현재 권한이 어떻게 설정되어 있는지를 알기 위해서는 원하는 디렉토리에서 ls -l이라는 명령을 통해 확인할 수 있다.
chown
파일이나 디렉토리의 소유자를 변경하는 명령어이다.
- chown (소유자가 될 user) (디렉토리나 파일 path) - 소유자 변경
- chown (user):(group) (디렉토리나 파일 path) - 소유자, 그룹 변경
- chown -R (user):(group) (디렉토리나 파일 path) - 하위 디렉터리까지 재귀적으로 변경
- chown -h (소유자가 될 user) (디렉토리나 파일 path) - 심볼릭 링크(원본 파일을 가리키는 링크, 윈도우의 바로가기와 비슷)까지 소유주 변경
- chown -h (소유자가 될 user) (디렉토리나 파일 path) - 모든 디렉토리의 심볼릭 링크를 변경
ln
linux/unix 시스템에서 링크는 두가지 종류가 있다. 하드 링크는 기존 파일의 다른 이름정도로 생각하면 되는 링크이다. 단일 파일에 대해 하나 이상의 하드링크를 만들 수 있다. 다른 파일 시스템 또는 파티션의 디렉터리 및 파일에 대한 하드 링크를 만들 수 없다. 소프트 링크는 윈도우의 바로가기와 같이 원본파일을 가리키는 간접 링크이다. 소프트링크인 심볼릭 링크는 다른 파일 시스템 또는 파티션의 디렉터리 및 파일에 대해 만들 수 있다. ln은 파일 간의 링크를 만드는 명령이다. 기본적으로 ln 명령은 하드 링크를 만든다. 심볼릭 링크를 만들려면 옵션을 붙여주어야 한다. ln은 성공하면 출력을 생성하지 않고 0을 반환합니다.
- ln (원본 파일) (링크 이름) - 하드 링크 생성
- ln -s (원본 파일) (링크 이름) - 심볼릭 링크 생성
- ls -l (링크 이름) - 링크가 성공적으로 생성 되었는 지 확인
- 심볼릭 링크를 삭제하려면 링크 해제 혹은 링크 제거
- unlink (링크 이름)
- rm (링크 이름)
참고자료:
https://studymake.tistory.com/240
https://studymake.tistory.com/239
https://www.leafcats.com/168
https://velog.io/@zeesoo/Linux-vi-%ED%8E%B8%EC%A7%91%EA%B8%B0-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EB%AA%85%EB%A0%B9%EC%96%B4
https://codingboycc.tistory.com/91
https://sunlightmedia.org/ko/bash-%EB%8C%80-zsh/
https://www.ibm.com/docs/ko/aix/7.2?topic=c-chsh-command
https://www.si.edu/tbma/resource/method-maintaining-bashrc-file-across-multiple-workstations-using-homebrew-and-github#:~:text=A%20bashrc%20file%20is%20shell,Terminal%20app%20looks%20and%20acts.
https://www.lesstif.com/lpt/linux-source-129008724.html
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sdrock&logNo=221508545540
https://recipes4dev.tistory.com/175
https://www.lesstif.com/lpt/linux-chown-93127453.html
https://jjeongil.tistory.com/1408
'CS' 카테고리의 다른 글
[Git] Git 기초 (0) | 2023.04.15 |
---|---|
[오토마타 이론] 유한 오토마타 기본 (언어, DFA & NFA) (0) | 2022.11.30 |
[네트워크] DNS란? (0) | 2022.09.27 |