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$

 

+ Recent posts