Shell
- 사용자 명령어 해석기
- 사용자가 입력한 명령어를 해석하여 Linux kernel에 전달
Shell 종류
종류 | 의미 |
Bourne shell(sh) | AT&T 벨 연구소에서 개발한 Original shell |
C shell(csh, tcsh) | C언어 문법을 적용하여 만든 shell History, aliases, job control, vi command edting and completetion 기능을 포함 |
korn shell(ksh) | 기존 bourne shell에 C shell의 기능을 포함 |
Bourne-again shell(bash) | GNU project로 만들어졌으며 csh, ksh이 가진 기능 포함하고있으며 bourne shell과 호환성이 높인 shell MAC OS 기본 shell |
fastwon1@docker-ubuntu:~$ cat /etc/shells //현재 시스템에서 사용가능한 shell목록 출력
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
fastwon1@docker-ubuntu:~$ echo $SHELL //현재 user의 shell 조회
/bin/bash
fastwon1@docker-ubuntu:~$ sudo chsh fastwon1 //shell변경
[sudo] fastwon1의 암호:
fastwon1의 로그인 쉘을 변경하고 있습니다
새로운 값을 넣거나, 기본값을 원하시면 엔터를 치세요
로그인 쉘 [/bin/bash]: /bin/sh
fastwon1@docker-ubuntu:~$ sudo grep fastwon1 /etc/passwd
fastwon1:x:1000:1000:fastwon1,,,:/home/fastwon1:/bin/sh
fastwon1@docker-ubuntu:~$
기본 조회
Shell의 변수?
- 데이터를 담는 그릇
- 선언할 필요없이 사용가능
- 변수명: 문자, 숫사, _로 구성, 시작은 반드시 문자나 _로 시작
fastwon1@docker-ubuntu:~$
fastwon1@docker-ubuntu:~$ name=jh //변수 선언
fastwon1@docker-ubuntu:~$ echo $name //변수 조회
jh
fastwon1@docker-ubuntu:~$ set | grep name // 변수 조회(현재 시스템에 존재하는 변수조회)
name=jh
__git_eread "$g/rebase-merge/head-name" b;
__git_eread "$g/rebase-apply/head-name" b;
__git_ps1_branch_name=$b;
b="\${__git_ps1_branch_name}";
local upstream=git legacy="" verbose="" name="";
name)
name=1
if [[ -n "$count" && -n "$name" ]]; then
__git_ps1_upstream_name=$(git rev-parse --abbrev-ref "$upstream" 2>/dev/null);
p="$p \${__git_ps1_upstream_name}";
p="$p ${__git_ps1_upstream_name}";
unset __git_ps1_upstream_name;
COMPREPLY=($( apt-cache pkgnames $cur 2> /dev/null ))
param="$dashoptions $( apt-cache pkgnames $cur 2> /dev/null ) $( command ps axo pid | sed 1d ) $( _apport_symptoms ) $( compgen -G "${cur}*" )";
compopt -o filenames;
compopt -o filenames;
compopt -o filenames 2> /dev/null;
compopt -o filenames;
COMPREPLY+=($(compgen -A hostname -P "$prefix$user" -S "$suffix" -- "$cur"));
_pnames ()
[[ $result -gt 0 ]] && compopt -o filenames 2> /dev/null;
echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1>&2;
local userland=$(uname -s);
fastwon1@docker-ubuntu:~$ unset name //변수 제거
fastwon1@docker-ubuntu:~$ echo $name
fastwon1@docker-ubuntu:~$
변수 선언 조회 제거
Shell의 환경변수?
- 동작 되는 프로그램에게 영향을 주는 변수
- 실행되는 애플리케이션에서 전달
환경변수 선언
- export valName=value
fastwon1@docker-ubuntu:~$ export NAME=jh //환경변수 설정
fastwon1@docker-ubuntu:~$ echo $NAME //환경변수 조회
jh
fastwon1@docker-ubuntu:~$ env | grep NAME //환경변수 조회
NAME=jh
LOGNAME=fastwon1
fastwon1@docker-ubuntu:~$ echo $HOME
/home/fastwon1
fastwon1@docker-ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
fastwon1@docker-ubuntu:~$ echo $USER
fastwon1
fastwon1@docker-ubuntu:~$ echo $SHELL
/bin/bash
fastwon1@docker-ubuntu:~$
환경변수 설정 및 조회
Metacharacters
- Shell에서 특별히 의미를 정해 놓은 문자들
Metacharacters | 의미 |
&& || | AND, OR 문자 |
< > >> | redirection 문자 |
* ? [ ] {} | glob 문자 [] : 집합 |
"" '' \ | Quoting 문자 : 메타문자의 의미를 제거하고 단순 문자로 변경 Double Quotes("") : "" 내의 모든 메타문자의 의미를 제거, 단 $, ``는 제외 Single Quotes('') : '' 내의 모든 메타문자의 의미를 제거 Bachslash(\) : \ 바로 뒤에오는 메타 문자의 의미를 제거 |
() | nesting command $(command) `command` $ echo "Today is $(date)" $ echo "Today is `date`" |
alias | shell 명령어에 새로운 이름을 부여 명령들을 조합하여 새로운 이름의 명령생성 alias 등록: alias name='command' alias 확인: alias or alias name alias 삭제: unalias name |
root@docker-ubuntu:/home/fastwon1/tmp# echo * //모든 파일이름 출력
abc test1 test2 test3 test4 test5 tt
root@docker-ubuntu:/home/fastwon1/tmp# echo a* //a로 시작하는 파일이름 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# echo ab* //ab로 시작하는 파일이름 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# echo ? // 파일이름의 길이가 1인 파일 출력
?
root@docker-ubuntu:/home/fastwon1/tmp# echo ??? // 파일이름의 길이가 3인 파일 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# echo ???? // 파일이름의 길이가 4인 파일 출력
????
root@docker-ubuntu:/home/fastwon1/tmp# echo ????? // 파일이름의 길이가 5인 파일 출력
test1 test2 test3 test4 test5
root@docker-ubuntu:/home/fastwon1/tmp# ls
abc test1 test2 test3 test4 test5 tt
root@docker-ubuntu:/home/fastwon1/tmp# touch sequenceFileName{1..10} //파일이름에 1~10까지의 순서를 붙여서 파일생성
root@docker-ubuntu:/home/fastwon1/tmp# ls
abc sequenceFileName10 sequenceFileName3 sequenceFileName5 sequenceFileName7 sequenceFileName9 test2 test4 tt
sequenceFileName1 sequenceFileName2 sequenceFileName4 sequenceFileName6 sequenceFileName8 test1 test3 test5
root@docker-ubuntu:/home/fastwon1/tmp# ls
abc sequenceFileName10 sequenceFileName3 sequenceFileName5 sequenceFileName7 sequenceFileName9 test2 test4 tt
sequenceFileName1 sequenceFileName2 sequenceFileName4 sequenceFileName6 sequenceFileName8 test1 test3 test5
root@docker-ubuntu:/home/fastwon1/tmp# ls [a-z]* // a~z까지 문자 중 하나를 가지는 파일 출력
abc sequenceFileName10 sequenceFileName3 sequenceFileName5 sequenceFileName7 sequenceFileName9 test2 test4 tt
sequenceFileName1 sequenceFileName2 sequenceFileName4 sequenceFileName6 sequenceFileName8 test1 test3 test5
root@docker-ubuntu:/home/fastwon1/tmp# ls [s-z]* // s~z까지 문자 중 하나를 가지는 파일 출력
sequenceFileName1 sequenceFileName2 sequenceFileName4 sequenceFileName6 sequenceFileName8 test1 test3 test5
sequenceFileName10 sequenceFileName3 sequenceFileName5 sequenceFileName7 sequenceFileName9 test2 test4 tt
root@docker-ubuntu:/home/fastwon1/tmp# ls [t-z]* // t-z까지 문자중 하나를 가지는 파일 출력
test1 test2 test3 test4 test5 tt
root@docker-ubuntu:/home/fastwon1/tmp# ls
abc sequenceFileName10 sequenceFileName3 sequenceFileName5 sequenceFileName7 sequenceFileName9 test2 test4 tt
sequenceFileName1 sequenceFileName2 sequenceFileName4 sequenceFileName6 sequenceFileName8 test1 test3 test5
root@docker-ubuntu:/home/fastwon1/tmp# ls [^s]* // s로 시작하는 파일이름 제외하여 출력
abc test1 test2 test3 test4 test5 tt
root@docker-ubuntu:/home/fastwon1/tmp# ls [^s-t]* // s~t까지로 시작하는 파일이름 제외하여 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# ls [s^]* // s로 시작하는 파일만 출력
sequenceFileName1 sequenceFileName2 sequenceFileName4 sequenceFileName6 sequenceFileName8
sequenceFileName10 sequenceFileName3 sequenceFileName5 sequenceFileName7 sequenceFileName9
root@docker-ubuntu:/home/fastwon1/tmp# ls [^s^t]* //s , t로 시작하는 파일을 제외하여 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# ls [a^]* // a로 시작하는 파일만 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# date // 현재시간 출력
2021. 08. 27. (금) 04:09:00 KST
root@docker-ubuntu:/home/fastwon1/tmp#
root@docker-ubuntu:/home/fastwon1/tmp# echo 'Today is date' // 현재시간 출력 실패
Today is date
root@docker-ubuntu:/home/fastwon1/tmp# echo 'Today is $(date)' //현재시간 출력 실패
Today is $(date)
root@docker-ubuntu:/home/fastwon1/tmp# echo "Today is $(date)" //현재 시간 출력
Today is 2021. 08. 27. (금) 04:09:19 KST
root@docker-ubuntu:/home/fastwon1/tmp# echo "Today is `date`" // $(date)와 동일하게 출력
Today is 2021. 08. 27. (금) 04:10:57 KST
root@docker-ubuntu:/home/fastwon1/tmp# date +%Y-%d-%m-%H-%M-%S //date를 formatting하여 출력
2021-27-08-04-16-25
root@docker-ubuntu:/home/fastwon1/tmp# touch report-$(date +%Y-%d-%m-%H-%M-%S) //formatting한 문자로 파일생성
root@docker-ubuntu:/home/fastwon1/tmp# ls
report-2021-27-08-04-16-41
root@docker-ubuntu:/home/fastwon1/tmp# touch report-`date +%Y-%d-%m-%H-%M-%S` //formatting한 문자로 파일생성
root@docker-ubuntu:/home/fastwon1/tmp# ls
report-2021-27-08-04-16-41 report-2021-27-08-04-16-54
root@docker-ubuntu:/home/fastwon1/tmp#
metacharacter 테스트
root@docker-ubuntu:/home/fastwon1/tmp# alias c=clear //alias 설정
root@docker-ubuntu:/home/fastwon1/tmp# alias
alias c='clear' //확인
alias comp='docker-compose'
alias cri='docker rmi -f `docker images -a -q`'
alias crm='docker rm -f `docker ps -a -q`'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias h='history'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias rm='rm -i'
root@docker-ubuntu:/home/fastwon1/tmp# unalias c //alias 삭제
root@docker-ubuntu:/home/fastwon1/tmp# alias
alias comp='docker-compose'
alias cri='docker rmi -f `docker images -a -q`'
alias crm='docker rm -f `docker ps -a -q`'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias h='history'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias rm='rm -i'
root@docker-ubuntu:/home/fastwon1/tmp#
alias 등록 삭제
Shell Prompt란?
- PS1 변수를 이용해 shell의 기본 프롬프트 모양을 설정
특수문자 | 의미 |
\h | 호스트이름 |
\u | 사용자 이름 |
\w | 절대경로 작업디렉토리 |
\W | 상대경로 작업디렉토리 |
\d | 오늘날짜 |
\t | 현재시간 |
\$ | $또는 # 프롬프트 모양 |
Redirection
Communication Channels | Redirection characters |
의 미 | |
STDIN | 0< | 0<< | 입력을 키보드가 아닌 파일을 통해 받음 |
STDOUT | 1> | 1>> | 표준 출력을 터미널이 아닌 파일로 출력 |
STDERR | 2> | 2>> | 표준 에러 출력을 터미널이 아닌 파일로 출력 |
& | 1>과 2>을 동시에 의미 program &> result.txt == program >> result.txt 2>&1 cat /etc/error.txt > /dev/null 2>&1 |
2>&1 : STDERR을 STDOUT으로 출력
fastwon1@docker-ubuntu:~/ta$ date > date.out //date명령어를 date.out로 출력
fastwon1@docker-ubuntu:~/ta$ cat date.out
2021. 08. 30. (월) 06:59:24 KST
fastwon1@docker-ubuntu:~/ta$ date >> date.out //date명령어를 date.out 파일에 append
fastwon1@docker-ubuntu:~/ta$ cat date.out
2021. 08. 30. (월) 06:59:24 KST
2021. 08. 30. (월) 06:59:36 KST
fastwon1@docker-ubuntu:~/ta$ ls
date.out
fastwon1@docker-ubuntu:~/ta$ ls date.out date.out2
ls: 'date.out2'에 접근할 수 없습니다: 그런 파일이나 디렉터리가 없습니다
date.out
fastwon1@docker-ubuntu:~/ta$ ls date.out date.out2 2> /dev/null //error메시지를 /dev/null로 버림
date.out //정상조회만 출력
Redirection
Pileline
fastwon1@docker-ubuntu:~$ ls -l | wc -l //현재파일의 수를 출력
31
fastwon1@docker-ubuntu:~$
fastwon1@docker-ubuntu:/etc$ cat passwd | cut -d: -f 1 | sort | wc -l //passwd파일을 : 기준으로 나누고
//첫번째 field를 정렬하여 유저의 수를 출력
48
fastwon1@docker-ubuntu:/etc$
'언어 > Sell Script' 카테고리의 다른 글
특정 형식의 파일들 중 특정 패턴들을 포함하고 있는 파일을 옮기는 스크립트 (0) | 2022.12.16 |
---|---|
rsync, expect 를 활용한 data 백업 (0) | 2022.12.09 |
Shell Script (0) | 2021.08.31 |