IT/리눅스마스터1급

shell이란

알콩달콩아빠 2022. 5. 19. 19:12
728x90
반응형

안녕하세요.

 

뚱보 프로그래머 입니다.

 

오늘은 shell 관련 내용입니다.

 

 

 

Shell

 

shell의 기능

 

shell이란 프로그램의 실행을 위한 인터페이스로, 사용자와 커널 사이에 정보를 전달해주는 역할을 한다. 사용자가 특정 명령어를 입력하면 우선 쉘이 접수하여 그 내용을 해석하고, 해석된 명령을 커널(kernel)에서 받아들여 실행할 수 있게끔 도와주는 명령어 처리기(command interpreter)이다. 커널은 하드웨어와 인터페이스하는 부분이다. 커널은 하드웨어와 사용자 프로그램의 중간에 위치하며, CPU, 메모리, 하드디스크 등의 하드웨어 자원을 제어하여 프로세스 스케쥴링, 기억장치 관리, 파일 관리, 시스템 호출 인터페이스, 멀티프로그래밍 지원, 파일 시스템 서비스, 입출력 서비스 등의 기능을 사용자에게 제공하는 운영체제의 핵심이다.

 

shell은 커널에서 분리된 별도의 프로그램이다. 예를 들어, 사용자가 ls 명령을 입력하면 커널은 디스크로부터 파일의 이름을 읽어들인 다음 그 결과를 화면에 출력한다. 본래 컴퓨터는 0 1만을 이해할 수 있다. 하지만 사람이 컴퓨터가 이해할 수 있는 0 1만을 사용하여 명령을 내리는 것이 너무나 어렵기 때문에 쉘이라는 것이 명령어를 입력받아 이를 컴퓨터가 이해할 수 있는 0 1로 된 명령으로 바꾸어 이 명령을 처리하도록 커널에 전달하는 것이다.

 

 

 

 

 

1)  (shell) 확인 및 변경

 

사용자가 로그인할 때 자동적으로 쉘이라는 프로그램이 실행된다.

 

/etc/shells 파일에는 현재 시스템이 사용할 수 있는 쉘들의 경로가 설정되어 있다.

 

/etc/passwd 파일에는 각 계정에 대해서 해당 쉘이 지정되어 있다.

 

 

 

현재 자신이 사용하고 있는 쉘을 확인하고 변경할 수 있다.

 

[root @edu00 /root]#echo $SHELL                        

 

/bin/bash

 

 

 

현재 시스템에서 사용 가능한 쉘의 목록을 나열한다.

 

[root @edu00 /root]#vi /etc/shells

 

 

 

잠시 쉘을 변경하고 싶을 때는 사용하려는 쉘을 프롬프트에서 실행시킨다. 그리고 해당 쉘을 빠져 나가려면 exit 명령을 사용한다.

 

[root @edu00 /root]#csh

 

[root @edu00 /root]#exit

 

 

 

기본 쉘을 변경하려면 chsh 명령어를 사용하거나 /etc/passwd 파일의 쉘 부분을 변경한다.

 

[root @edu00 /root]# chsh

 

Changing shell for root.

 

Password:

 

New shell[/bin/bash]: /bin/csh

 

Shell changed 

 

[root @edu00 /root]#cat /etc/passwd | grep root

 

root:x:1:1::/root:/bin/csh

 

[root @edu00 root]#echo $SHELL

 

/bin/csh

 

 

 

2) 쉘 환경 설정 파일

 

리눅스에서는 여러 가지 환경 설정 파일을 제공한다. 일반적으로 환경 설정 파일은 /etc에 있지만 각 사용자들을 자유롭고 융통성있게 만들어주는 환경 설정 파일들은 각 사용자의 홈 디렉토리에 위치하고 있으며 보통 .으로 시작하는 파일들이다. (.)으로 시작하는 파일들은 ls –a 명령으로 파일의 존재를 확인할 수 있으며 파일의 이름은 Resource Configuration이라는 의미의 rc 라는 철자로 끝나는 경우가 많다.

 

새로운 사용자를 등록하면 /etc/skel 디렉토리에 기본값으로 저장되어 있는 이런 파일들이 새로운 사용자의 홈 디렉토리에 복사되고 이 파일들 중 쉘 구동환경을 설정하는 파일들도 있다.

 

 

 

1] .bashrc 

 

쉘을 위한 쉘 스크립트로 서브 쉘, 즉 비로그인 쉘이 실행될 때 명령과 프로그램 구조로 구성되어 있다.

 

새로운 쉘이 실행될 때마다 이 파일이 실행된다.

 

 

 

2] .bash_profile

 

로그인할 때 읽어 들이는 설정 파일이다. 주요 설정 내용은 검색 경로, 터미널 종류, 환경 변수 등을 설정하고 그 외 로그인 시점에 실행하고 싶은 명령, 시스템에 대한 정보 등을 보여주는 명령을 수행한다.

 

 

 

3] .bash_logout

 

로그인 쉘이 종료되면서 읽어 들인다.

 

 

 

4] /etc/profile

 

시스템 전반에 영향을 미치는 설정 파일이다.

 

 

 

5] /etc/bashrc

 

시스템 전반에 영향을 미치고 새로운 쉘이 실행될 때 마다 실행된다.

 

 

 

3) 쉘 환경 변수

 

환경 변수는 쉘 환경을 사용자의 구미에 맞게 설정하는데 사용되는 값들을 가지고 있다. 이 변수값들의 설정을 변경함으로써 사용자마다 원하는 환경을 설정할 수 있으며 쉘 프로그래밍에도 유용하게 사용된다.

 

 

 

1] DISPLAY

 

현재 X 윈도우 디스플레이 위치

 

 

 

2] HOME

 

사용자 홈 디렉토리

 

 

 

3] HOSTNAME

 

로그인 쉘이 실행되면서 읽어들인다.

 

 

 

4] PATH

 

요구하는 명령어들이나 응용 프로그램을 찾아내기 위해 시스템이 왼쪽부터 오른쪽 순서로 검색하는 디렉토리들의 집합으로 일반적으로 사용하고자 하는 명령어들은 모두 PATH 변수에 들어 있는 디렉토리 안에 있어야 한다. 그 디렉토리에 들어 있지 않은 명령을 실행하기 위해서는 완전한 경로명을 적어주어야 한다.

 

[root @edu00 /root]#echo $PATH 

 

 

 

5] PS1

 

PS1은 주 프롬프트 문자열이다. bash는 명령어 입력행의 시작 부분이 보이기 전에 $PS1의 값에 의해 완전한 치환을 수행한다. /etc/bashrc 파일에서 $PS1 설정 내용을 확인한다.

 

 

 

6] PWD

 

현재 디렉토리의 완전한 경로명을 가리킨다.

 

 

 

7] SHELL

 

쉘의 경로명을 의미한다.

 

 

 

8] TERM

 

사용자의 터미널의 타입을 가리키는 상징적인 영숫자 문자열이다. 쉘에서는 직접 쓰이지 않고 TERM이라는 변수명은 일반적인 시스템 용법을 위해 따로 저정해둔다.

 

 

 

9] MANPATH

 

맨페이지의 검색 경로이다.

 

 

 

10] LS_COLORS

 

파일, 디렉토리 등에 대한 색 설정 변수이다. /etc/DIR_COLORS 파일에서 색 설정을 한다.

 

 

 

11] EDITOR

 

주로 사용하는 편집기를 설정한다.

 

 

 

 

 

4) 설정된 환경 변수값 확인 및 변경

 

 

 

1] 환경 변수값 확인

 

 

 

1> 변수 마다 확인

 

[root @edu00 /root]#echo $PATH

 

[root @edu00 /root]#printenv PATH

 

 

 

2> 모든 변수값 확인

 

[root @edu00 /root]#printenv

 

 

 

2] 환경 변수값 설정/변경

 

 

 

1> 사용법

 

$export [환경변수명]=[변수값]

 

 

 

[root @edu00 /root]#echo $PATH

 

[root @edu00 /root]#export PATH=/tmp:$PATH

 

[root @edu00 /root]#echo $PATH

 

 

 

2> $HOME/.bash_profile

 

각 사용자 계정 디렉토리 아래있는 .bash_profile 파일을 수정하여 변수값 설정, 변경이 가능하다. 이 파일을 수정하면 쉘 실행시마다 변경할 필요가 없다.

 

#vi $HOME/.bash_profile

 

변수명=변수값

 

#source $HOME/.bash_profile

 

설정 내용을 적용시킨다.

 

 

 

3] 쉘 활용하기

 

 

 

1> 한라인에서 여러 명령어 사용하기

 

[root @edu00 linux]#ls ; cd public_html

 

 

 

2> 여러 라인에 하나의 명령어 사용하기

 

[root @edu00 linux]#ls -l public_html \

 

>linuxnara

 

 

 

3> 명령(파일 이름) 완성 기능

 

명령어가 길거나 이름의 일부만 생각날 경우 명령어의 일부만 입력하고 TAB 키를 누르면 가능한 명령어를 완성시켜준다. 만일 해당하는 명령어가 둘 이상인 경우 해당하는 명령어의 리스트를 보여준다.

 

[root @edu00 linux]#ls [Tab  2]

 

[root @edu00 linux]#ls /etc/pass [Tab  2]

 

 

 

4> 명령어 history 기능

 

[root @edu00 /root]#vi ~/.bash_history

 

[root @edu00 /root]#history

 

[root @edu00 /root]#history 10

 

 

 

5> alias 기능

 

alias 별명이름=실행될 명령의 정의

 

[root @edu00 /root]#vi ~/.bashrc

 

alias dir="ls -al | more"

 

[root @edu00 /root]#source ~/.bashrc     : 설정 적용

 

 

 

[root @edu00 linux]#alias lcd=”ls ; cd /home”

 

: 쉘이 끝나면 설정도 사라진다.

 

[root @edu00 linux]#alias lcd

 

[root @edu00 linux]#lcd

 

 

 

6> 작업(job) 제어  

 

리눅스에서는 명령을 백그라운드로 수행하는 것이 가능하다. 터미널 상의 명령 프롬프트 상에서 명령어를 수행할 때 이것을 백그라운드로 처리하려면 수행하려는 명령 뒤에 &를 붙여 수행한다.

 

이것은 백그라운드로 실행하고 있는 명령과는 상관없이 명령 프롬프트 상에서 다른 명령을 수행할 수 있는 것이다.

 

jobs라는 명령어는 현재 백그라운드로 수행되고 있는 작업을 확인할 때 사용하는 명령이다. 이 명령을 사용하면 작업 번호, 상태, 수행 명령 순서로 화면에 출력된다.

 

#find / -name core > corelist 2> errmsg &

 

#jobs

 

 

 

fg 명령은 백그라운드로 실행중인 작업을 foreground로 실행시키려 할 때 사용하며 background로 실행중인 작업이 여러 개인 경우, 작업 번호 혹은 같은 명령이 수행되고 있는 경우가 아니라면 그 명령을 적어준다.

 

#find –user linux > linuxlist 2> linuxerr &

 

#find / -name core > corelist 2> errmsg &

 

#jobs

 

#fg [작업 번호]

 

#bg 명령은 현재 멈춰진 명령을 다시 수행시키되 백그라운드로 수행시키려 할 때 사용한다.

 

 

 

Ctrl+z는 포그라운드로 수행되고 있는 명령을 잠시 멈추는 명령이다.

 

Ctrl+c foreground로 수행중인 명령을 중지, 끝내고자 하는 경우 사용한다.

 

 

 

5)  인용(quoting) 규칙

 

 

 

1] metacharacter

 

~           홈 디렉토리

 

`            명령 대체(command substitution)

 

#           주석(comment)

 

$            Shell 변수

 

&           후면 작업(background job)

 

*            문자열 wildcard

 

()           부속 shell(subshell)

 

\          escape 문자

 

|            파이프(pipe)

 

[]          문자 집합 wildcard

 

{}          명령 집합 

 

;            shell 명령 분리자

 

<           입력 재지정

 

>           출력 재지정

 

/            경로명 디렉토리 분리자

 

?            한 문자 wildcard

 

!            명령문 history

 

 

 

 

 

2]  $ (dollar sign)

 

shell 변수를 나타낼 때 사용하며, 변수에 특정한 값을 부여할 때는 =를 사용한다.

 

[root @edu00 /root]#LANG=ko_KR

 

[root @edu00 /root]#echo $LANG

 

ko_KR

 

[root @edu00 /root]#export LANG

 

[root @edu00 /root]#date

 

[root @edu00 /root]#LANG=euc_UN

 

[root @edu00 /root]#echo $LANG

 

euc_UN

 

[root @edu00 /root]#export LANG

 

[root @edu00 /root]##date

 

 

 

[root @edu00 /root]#echo $PATH

 

 

 

3]  single quotes: ' '

 

따옴표 안에 있는 모든 문자들의 특별한 의미를 제거한다.

 

[root @edu00 /root]#echo '$PATH'

 

$PATH

 

 

 

4]  double quotes: " "

 

따옴표 안에 있는 문자들의 특정한 의미를 보호한다.

 

[root @edu00 /root]#echo "$PATH"

 

 

 

5]  backslash: \

 

backslash 다음에 오는 문자의 특별한 의미를 제거한다.

 

[root @edu00 /root]#echo \$PATH

 

$PATH

 

 

 

6]  back quotes: ` `

 

안에 있는 문자열을 명령어로 인식하여 대체

 

[root @edu00 root]#echo "Current Working Directory is `pwd`"

 

Current Working Directory is /root

 

 

 

7]  예제

 

[root @edu00 root]#echo \$$PATH

 

 

 

[root @edu00 root]#echo "Hi! $USER. It's `date` today"

 

Hi! Root. It's june 11, 2001 today.

 

 

 

6) 파일 이름 확장

 

특수 문자를 이용하여 한 번에 여러 개의 파일이나 경로명을 표시할 수 있다.

 

와일드 카드 문자를 사용하여 임의의 문자를 대체할 수 있다.

 

?                         한 문자를 대체

 

*                         임의의 길이의 문자를 대체

 

[chars] chars 문자 중의 하나로 대체

 

[!chars]             chars에 없는 문자 중의 하나로 대체

 

[^chars]             chars에 없는 문자 중의 하나로 대체

 

 

 

[ ] [  ] 사이에 문자를 나열하여 "-중의 하나"로 표현, 범위를 지정할 때는 "-"

 

[abc]

 

[.,;]

 

[-_]

 

[*?]

 

[a-z]

 

[A-Z]

 

[!0-9]

 

[a-zA-Z]

 

 

 

7) 환경 명령

 

set    : 환경 변수와 사용자가 정의한 로컬 변수 등 모든 쉘 변수를 보여준다.

 

env    : 시스템의 환경 변수를 보여준다.

 

export : 지역 변수를 환경 변수로 만든다.

 

unset  : 변수를 없앤다.

 

 

 

[root @edu00 /root]#env

 

 

 

[root @edu00 /root]#set

 

 

 

[root @edu00 /root]#LANG=ko_KR

 

 

 

[root @edu00 /root]#export LANG

 

or

 

[root @edu00 /root]#export LANG=ko_KR

 

 

 

8) 명령어 히스토리(command history)

 

입력하여 실행했던 모든 명령들은 히스토리 리스트 버퍼에 저장이 된다. 명령행에서 입력해 사용한 명령들은 스택에 저장되어 다시 그 명령어를 사용할 때는 스택에서 꺼내어 사용할 수 있다.

 

히스토리 파일은 각 사용자의 홈 디렉토리에 .bash_history 라는 이름으로 존재하며, 쉘 실행 중에는 메모리에만 명령어 히스토리를 기억하고 있다가 쉘을 중단했을 때 .bash_history 파일에 저장된다.

 

명령행에서 history 명령을 실행하면, 히스토리 리스트에 있는 명령어들이 번호순으로 출력된다. HISTSIZE 변수에 히스토리 스택의 크기가 지정되어 있으며, HISTFILE에는 히스토리 파일의 위치가, HISTFILESIZE에는 히스토리 파일의 크기가 지정되어 있다.

 

[root @edu00 root]#echo $HISTFILE

 

/root/.bash_history

 

[root @edu00 root]#echo $HISTSIZE

 

1000

 

[root @edu00 root]#HISTSIZE=1

 

[root @edu00 root]#echo $HISTSIZE

 

1

 

[root @edu00 root]#history

 

[root @edu00 root]#HISTSIZE=100

 

[root @edu00 root]#echo $HISTSIZE

 

100

 

[root @edu00 root]#history

 

 

 

히스토리 명령문은 !를 이용하여 대체할 수 있다.

 

!!

 

!n

 

!-n

 

!string    : 가장 최근에 string으로 시작하는 명령문을 실행한다.

 

!?string?  : 가장 최근에 실행했던 명령문 중 string을 포함하는 명령문을 실행한다.

 

^string1^string  : 마지막 실행 명령문의 string1 string2로 대체한 후 실행한다.

 

 

 

9) alias

 

alias 별명이름=실행될 명령의 정의

 

alias를 현재 로그인되어 있는 상태뿐만 아니라 앞으로도 계속 사용하고 싶다면, ~/.bashrc 파일에 추가하여 사용할 수 있다.

 

설정 내용을 적용하여 사용하고자 할 경우#source ~/.bashrc

 

 

 

[root @edu00 /root]#alias      

 

: 현재 쉘에서 사용되고 있는 alias 목록 나열

 

 

 

[root @edu00 /root]#alias 별명

 

: 별명이 어떻게 정의되어 있는지 확인

 

 

 

[root @edu00 /root]#unalias   

 

: 현재 로그인되어 있는 상태에서만 alias 사용하지 않기 위해서 사용

 

계속 사용하지 않으려면 ~/.bashrc 파일에서 해당 설정 라인을 삭제

 

 

 

[root @edu00 /root]#unalias 별명

 

 

 

10) Redirection

 

초기값으로 쉘 프롬프트에서 입력하는 것은 표준 입력이라고 하여, stdin이라는 파일로 처리되며, 그 입력을 쉘에서 처리해서 그 결과를 터미널로 다시 보여준다면 그것은 표준 출력이라고 하여 stdout이라는 파일로 처리된다.

 

 

 

[root @edu00 linux]#cat < /etc/passwd > /home/linuxpasswd

 

[root @edu00 linux]#cat << END

 

: END라는 문자열이 나올 때까지 계속해서 문자를 stdin으로 받게 된다.

 

>hi linux

 

>hello!! END

 

>END

 

>^D

 

 

 

11) 파이프라인

 

유닉스에서는 각각 다른 명령어들을 두개 이상 서로 연결해서 사용할 수 있다. 파이프는 현재 명령의 표준 출력을 다음 명령의 표준 입력으로 사용하는 것을 말한다.

 

[root @edu00 linux]#who  | wc –l

 

[root @edu00 linux]#ps aux | grep httpd

 

 

 

12) 로그인

 

/etc/passwd 파일의 패스워드 필드가  *등으로 lock되어 있는 계정도 쉘 부분에 정상적인 쉘이 들어있다면(/bin/false가 아닌 /bin/sh) 정상적인 쉘로 로그인된다.

 

사용자가 시스템에 로그인을 하게 되면 각각의 사용자에게는 시스템에 의해서 shell이 부여된다.

 

물론 로그인을 하더라도 shell이 부여되지 않는 경우도 있으나 그것은 해당 사용자에게 시스템 관리자가 shell을 부여하지 않겠다고 세팅을 함으로써 가능하다.

 

shell이 부여된 사용자는 시스템내에서 shell상태에 놓여있다고 할 수 있으며, 이 사용자는 shell을 이용하여 프로그램들을 실행시킬 수 있다.

 

728x90
반응형

'IT > 리눅스마스터1급' 카테고리의 다른 글

root shell  (0) 2022.05.19
쉘 스크립트  (0) 2022.05.19
에디터  (0) 2022.05.19
RPM이란  (0) 2022.05.19
부팅 프로세스  (0) 2022.05.19