본문 바로가기

13. OS

[Linux] 2. shell

https://www.yes24.com/Product/Goods/56681458

 

페도라 리눅스 - 예스24

시스템, 서버 및 네트워크, 보안까지 한 권으로 정복하는 페도라 리눅스리눅스에 대한 기본 지식을 쌓고자 하는 컴퓨터 관련 학과 학생을 대상으로 한다. 대부분의 윈도 사용자를 위해 리눅스를

www.yes24.com

 

 

◎ 셸은 사용자와 리눅스 커널 사이에서 중간자 역할을 수행한다.

 

● 명령어 해석기 기능

 사용자와 커널 사이에서 명령을 해석하여 전달하는 해석기(interpreter)와 번역기(translator)기능이다.

사용자가 입력한 명령이나 파일에서 읽어들인 명령을 해석하고 적절한 프로그램을 실행한다.

용자가 로그인을 하면 자동으로 실행되는 셸을 로그인 셸이라고 하며 /etc/passwd 파일에 사용자별로 지정되어있다.

vi /etc/passwd

ㆍ프롬프트 (prompt)

셸이 사용자의 명령을 기다리고 있음을 나타내는 표시 

 

● 프로그래밍 기능

 셸의 프로그래밍 기능을 이용하면 여러 명령을 사용하여 반복적으로 수행하는 작업을 하나의 프로그램 혹은 파일로 만들 수 있는데, 이렇게 작성된 것을 셸 스크립트(파일)라고 부른다.

 

● 사용자 환경 설정 기능

 셸은 사용자 환경을 설정할 수 있도록 초기화 파일 기능을 제공한다.

초기화 파일에는 명령을 찾아오는 경로를 설정하거나, 파일과 디렉토리를 새로 생성할 때 기본 권한을 설정하거나, 다양한 환경 변수 등을 설정할 수 있다.

 

 

셸은 원래 유닉스에서 제공한 것으로, 대부분의 유닉스 시스템이 지원하는 주요 셸의 종류에는 본 셸, C 셸, 콘 셸, 배시 셸 등이 있다.

명령이름은 다음과 같다.

본 셸 : sh

C 셸 : csh

콘 셸 : ksh

배시 셸 : bash

 

현 시스템에서 바꿀 수 있는 셸의 종류는 /etc/shells 파일에 지정되어 있다.

 

/usr/sbin/nologin

사용자가 시스템에 로그인할 수 없도록 하는 특별한 로그인 셸.

일반적으로 시스템 관리 작업에 사용되는 사용자 계정에 할당.

 

사용자는 프롬프트에서 다른 셸을 실행할 수 있다.

이렇게 새로 생성된 셸을 서브 셸이라고 부른다.

서브 셸을 종료하는 명령은 ctrl + d, exit 등으로 일반 셸의 로그아웃 명령과 같다.

서브 셸 실행

 

◎ 셸 내장 명령

 셸은 자체적으로 내장 명령을 가지고 있다. 내장 명령어는 외부 바이너리 파일로써 디스크에서 실행되는 것이 아니라 셸 자체에 내장되어 있으므로, 따로 실행 파일을 찾을 필요 없이 즉시 사용할 수 있다. (성능 향상)

일반적인 리눅스 명령이 /usr/bin 디렉토리에 별도의 실행 파일로 있는 것과 달리, 셸 내장 명령은 별도의 실행 파일이 없고 셸 안에 포함되어 있다.

vi /usr/bin/cd

builtin

셸에서 사용되는 용어로, 셸 자체에 내장되어 있는 명령어나 함수를 가리킨다.

 

◎ 특수문자

*(별표) : 임의의 문자열을 나타내는데 사용한다.

?(물음표), [](대괄호) : 하나의 문자를 나타내는데 사용한다.

예시

~(물결표) : 현재 작업중인 사용자의 홈 디렉토리

~로그인ID : 해당 사용자의 홈 디렉토리

-(붙임표) : cd 명령으로 디렉토리를 이전하기 직전의 작업 디렉토리 (상위 디렉토리 X)

;(쌍반점), | (파이프) : 명령과 명령을 연결한다.

;은 연결된 명령을 왼쪽부터 차례로 실행

|는 왼쪽 명령의 실행 결과를 오른쪽 명령의 입력으로 전달한다.

예시

''(작은따옴표) : 문자를 감싸서 문자열로 만들어주고, 문자열 안에 사용된 특수 문자의 기능을 없앤다.

""(큰따옴표) : 작은 따옴표와 비슷하지만 $, `, \ 는 제외된다.

``(백쿼터, 백쿼테이션) : js의 백틱과 비슷하게 ``로 감싸인 문자열을 명령으로 해석하여 실행.

\(역슬래시) : 특수문자 바로 앞에 사용하며, 해당 특수문자의 효과를 없앤다.

예시

>, <, >> : 입출력의 방향을 바꾸는 특수문자.

일반적으로 키보드로 명령을 입력하고 실행 결과는 화면에 출력되었는데 이것을 다르게 하고싶을 때 사용한다.

ㆍ명령의 실행 결과를 파일로 저장하고 싶을 때 

ㆍ파일에서 입력값을 읽어올 때

 

 

 

◎ 표준 입출력 장치

[Linux] 1. 디렉토리와 파일

 

● 파일 디스크립터(file descriptor)

 운영 체제에서 파일을 식별하고 제어하기 위한 개념이다. 파일 디스크립터는 파일을 열 때 생성되며, 파일과 관련된 메타데이터를 추적하고 파일의 내용에 대한 입출력 작업을 수행하는데 사용된다. 대부분의 시스템에서는 파일 디스크립터가 정수 값으로 표현된다.

 

파일 디스크립터 파일 디스크립터 대신 사용하는 이름 정의
0 stdin 명령의 표준 입력
1 stdout 명령의 표준 출력
2 stderr 명령의 표준 오류

 

표준 입출력 장치를 파일로 바꾸는 것을 리다이렉션(redirection)이라고 한다.

 

● 출력 리다이렉션

 출력의 방향을 바꾸는 출력 리다이렉션은 두 가지 방법이 있다. 두 방법의 차이는 출력 결과를 저장할 파일이 이미 존재하는 파일인 경우 기존 파일의 내용을 유지할 것인지 여부이다.

기존 파일의 내용을 삭제하고 새로 결과를 저장할 때 : >

기존 파일의 내용 뒤에 결과를 추가할 때 : >>

기존 파일이 존재하더라도 묻지 않고 바로 실행되기 때문에 항상 해당 이름의 파일이 있는지 확인하자.

중간에 사진을 다시 찍어서 ls -alh 목록에 ddddddddddddddddddd.txt가 빠져있다.

 

ls -alh > ddddddddddddddddddd.txt
ls >> ddddddddddddddddddd.txt
date > ddddddddddddddddddd.txt

 

다음과 같이 set 명령으로 overwrite을 예방할 수 있다.

① set -o noclobber 명령어를 치면 overwrite가 되지 않는다.

(기존 내용에 추가하는 >> 는 상관없음)

② set +o noclobber 명령어를 치면 다시 원래대로 돌아온다.

 

 

오류 리다이렉션

 명령을 실행하는 과정에서 셸이 화면에 출력하는 메시지는 두 가지이다. 하나는 명령의 정상적인 실행 결과(표준 출력)이고, 또 하나는 명령 실행 중 발생하는 오류 메시지(표준 오류)이다.

 

표준 출력과 표준 오류 모두 기본 장치가 화면으로 지정되어 있어서 같은 것처럼 보이지만 실은 다르게 관리되고 있다. 표준 출력은 1번, 표준 오류는 2번 장치이다.

 

2>, 2>> : 표준 오류 메시지를 파일에 저장한다. 

이런식으로 한번에 같이 저장할 수도 있다.

 

명령 실행 중 나타나는 오류 메시지를 무시하고 싶을 때는 리눅스의 특수 파일인 /dev/null을 사용하면 된다.

 

 

 입력 리다이렉션

 표준 출력과 비슷하게 < 특수 기호를 사용하여 표준 입력을 바꾼다.

cat 명령은 파일의 내용이나 키보드로 입력을 받아 화면에 출력하는 명령이다. cat 명령이 파일을 읽어서 출력하는 기능은 <를 생략한 것으로, 표준 입력이 자동으로 파일로 리다이렉션한 것이다.

 

date 명령어와 dddd.txt 에서 읽어온 내용이 같은것을 확인할 수 있다.

 

&

셸에서 파일 디스크립터 번호를 지정하는 데 사용된다.

 

2>&1

표준 오류 스트림을 표준 출력 스트림으로 리다이렉트 한다는 의미이다.  >&2 이거의 경우 반대 의미.

 

 

◎ 표준 입출력 장치

 셸은 셸의 환경을 설정하기 위한 값을 저장할 수 있도록 셸 변수와 환경 변수를 제공한다.

셸 변수 : 해당 셸의 지역변수

환경 변수 : 로그인 셸과 서브 셸 모두 공통적으로 적용

 

셸의 변수를 출력하는 명령은 set과 env이다.

set : 셸 변수와 환경 변수를 모두 출력

env : 환경변수만 출력

 

환경 변수 중에서 자주 사용되는 주요 변수는 다음과 같다.

환경변수 의미 환경변수 의미
HISTSIZE 히스토리 저장 크기 PATH 명령을 탐색할 경로
HOME 사용자 홈 디렉토리의 절대 경로 PWD 작업 디렉토리의 절대 경로
LANG 사용하는 언어 SHELL 로그인 셸
LOGNAME 사용자 계정 이름    

 

셸 변수를 설정하는 방법은 다음과 같다.

변수명=문자열

 

환경 변수를 설정하는 방법은 먼저 셸 변수를 정의하고 export 명령을 사용하여 환경 변수로 바꿔준다.

 

● export [옵션] [셀 변수]

지정한 셸 변수를 환경 변수로 바꾼다.

 

ㆍ옵션

-n : 환경 변수를 셸 변수로 변경한다.

 

ex)

export SOME

export -n SOME

 

 

정의된 변수를 해제할 때는 unset 명령을 사용한다.

 

● unset [변수]

지정한 변수를 해제한다.

 

ex)

unset SOME

 

 

◎ alias, history

이 기능은 원래 본 셸에는 없던 기능으로 C 셸에서 처음 등장하여 콘 셸과 배시 셸에서 모두 제공하고 있다.

-h 옵션을 추가하여 파일 크기가 옵션이 적용되어 나오는 것을 확인할 수 있다.

 

alias 명령어로 현재 설정된 별칭 목록을 확인하고 이름='명령'을 추가하여 추가 및 설정을 할 수 있다.

이 때 =를 중심으로 좌우에 공백이 있으면 안 된다. 공백이 있을 경우 작은 따옴표로 묶어야 한다.

 

기존 설정되어 있는 alias을 삭제하려면 unalias를 해주면 된다. 

 

 

● alias

alias를 생성한다.

 

ex)

alias : 현재 설정된 별칭 목록을 출력한다.

alias 이름='명령' : 명령을 수정하여 사용하는 경우이다.

alias 이름='명령;명령2;...' : 여러 명령을 하나의 이름으로 사용하는 경우이다.

 

● unalias

alias를 삭제한다.

 

 

history는 내가 입력했던 명령 기록을 볼 수 있다.

 

!! : 바로 직전에 실행한 명령을 재실행한다.

!번호 : 히스토리에서 해당 번호의 명령을 재실행한다.

!문자열 : 히스토리에서 해당 문자열로 시작하는 마지막 명령을 재실행한다.

 

히스토리는 터미널에서 작업을 마치고 로그아웃할 시 홈 디렉토리의 .bash_history 파일에 저장된다.

 

 

◎ 프롬프트 설정

프롬프트(prompt)는 사용자에게 명령을 입력받을 준비가 되었음을 알리는 표시이며, 사용자가 명령을 입력하는 위치를 나타낸다. 이 프롬프트의 형태는 사용자가 원하는 모양으로 바꿀 수 있다.

 

사진에는 실습하다가 앞부분에 공백이 빠져있다.

초기 PS1 값을 prompt.txt에 저장해두고 다시 초기 상태로 되돌렸다.

default PS1 값은 다음과 같다.

[\u@\h \W]\$ 

\u : 사용자 이름

\h : 호스트 이름

\W : 현재 작업 디렉토리명

\$ : $가 특수문자를 일반문자로 쓰기 위해 앞에 \ 추가

 

\로 시작하는 특별한 문자를 이스케이프 문자라고 한다.

 

 

프롬프트를 컬러로 바꿔보자.

'\[\e[x;y;nm\] 프롬프트 \[\e[x;y;0m\]'

\[ : 출력하지 않을 문자열의 시작 부분을 표시

\e : 터미널 제어를 알리는 이스케이프 문자

x;y;nm : x는 글자색, y는 배경색, n는 스타일 코드(굵기 등), m은 설정 시퀀스의 끝을 나타낸다.

 

프롬프트 뒤에 \[\e[x;y;0m\]을 붙여주는 이유는 원래 색상으로 돌아가기 위한 것이다. 지정하지 않으면 이후 셸의 모든 출력이 프롬프트의 색상과 같아진다

 

글자색,배경색,스타일 번호에 따라 해당 내용으로 바뀐다.

 

BLUE_PS1="\[\e[34;1m\]$PS1\[\e[0m\]"
export PS1=$BLUE_PS1

글자색 파란색, 굵게

 

 

◎ 환경 설정 파일

위에서 설정한 alias나 prompt는 로그아웃을 하면 모두 사라진다. 이것을 환경 설정 파일에 필요한 설정을 저장하고 로그인 할 때 마다 불러오게 하자.

 

사용자가 로그인할 때마다 자동으로 실행되는 명령을 저장해놓은 것이 환경 설정 파일이다.

환경 설정 파일에는 시스템 환경 설정 파일사용자 환경 설정 파일이 있다. 환경 설정 파일은 주로 사용자가 로그인할 때 실행되어 사용자 환경을 초기화하므로 초기화 파일이라고도 부른다.

 

 

● 시스템 환경 설정 파일

시스템을 사용하는 전체 사용자의 공통 환경을 설정하는 파일로 모든 사용자가 로그인할 때마다 무조건 실행된다. 배시 셸의 시스템 환경 설정 파일은 /etc 디렉토리에 있다.

파일 기능
/etc/profile ㆍ시스템 공통으로 적용되는 환경 변수를 설정한다.
  - PATH : 기본 명령 경로를 설정한다.
  - USER, LOGNAME : 사용자 UID와 이름을 설정한다.
  - HOSTNAME : 호스트명을 설정한다.
  - HISTSIZE : 히스토리 크기를 설정한다.

ㆍ기본 접근 권한을 설정한다.
ㆍ /etc/profile.d/*.sh를 실행한다. 
/etc/bashrc ㆍ시스템 공통으로 적용되는 함수와 ailas를 설정한다.
ㆍ기본 프롬프트를 설정한다.
ㆍ서브 셸을 위한 명령 경로를 설정한다.
ㆍ서브 셸을 위한 기본 접근 권한을 설정한다.
/etc/profile.d/*.sh  ㆍ언어나 명령별로 각각 필요한 환경을 설정한다.
ㆍ필요시 설정 파일을 추가한다.

 

이중 /etc/profile과 /etc/bashrc 파일은 향후 리눅스 업데이트 시 일관성 있는 관리를 위해 수정하지 말 것을 권고한다. (CentOS 7의 경우 업데이트가 멈춰서 잘 모르겠....)

 

 

● 사용자 환경 설정 파일

각 사용자의 홈 디렉토리에 숨김 파일로 있으며 사용자가 내용을 수정하고 관리할 수 있다.

사용자가 로그인하면 제일 먼저 시스템 환경 설정 파일이 실행되어 시스템 공통 환경을 만들고, 이후 사용자 환경 설정 파일을 순서대로 실행하여 사용자별 환경을 설정한다. 배시 셸의 경우 다음과 같다.

 

파일 기능
~/.bash_profile 로그인 시 한번만 실행되는 명령어를 설정하는데 사용된다.
새로운 로그인 세션이 시작될 때 사용자의 환경을 설정하고 초기화하는데 주로 사용한다.
~/.bashrc 새로운 셸 세션을 시작할 때마다 실행되는 명령어를 설정하는데 사용된다.
로그인이 아닌 경우에도 매번 실행되므로, 셸의 환경변수, 별칭, 함수 등을 설정하는데 주로 사용한다.
~/.bash_logout 로그아웃 시 실행할 필요가 있는 함수 등을 설정한다.

 

prompt와 alias 설정하여 다음 로그인 시에도 적용

 

'13. OS' 카테고리의 다른 글

[Linux] 5. 파일 시스템과 디스크 관리  (1) 2024.03.28
[Linux] 4. 프로세스 관리하기  (0) 2024.03.21
[Linux] 3. 파일의 접근 권한  (0) 2024.03.18
[Linux] 1. 디렉토리와 파일  (0) 2024.03.14
[Linux] 명령어  (0) 2023.12.14