본문 바로가기

자격증/리눅스 마스터 1급

Part1) 리눅스의 실무의 이해 - 리눅스 시스템의 이해(3) | X 윈도우, 쉘(Shell)

I. X 윈도우 - (매년 출제)


X 윈도우 시스템(X Window System): 리눅스에서 GUI 환경을 위한 시스템으로, 모든 종류의 애플리케이션과 유틸리티에 대해 GUI를 사용할 수 있는 기본 플랫폼을 제공하는 클라이언트/서버 시스템이다. 분산형 개방 시스템을 개발하기 위한 목적으로 수행된 아데나 프로젝트의 일환으로 MIT에서 1984년 최초로 개발되었다.

1) X-windows 시스템을 이루는 요소


 1. 서버 클라이언트: 윈도우 시스템은 두 개의 개별 소프트웨어 부분에 의해 제어되는 서버/클라이언트 시스템이다. 클라이언트는 응용프로그램을 실행하기 위한 프로그램과 자원을 제공하고, 서버는 응용 프로그램에서 수행된 결과를 출력 장치에 표시하는 역할을 한다.


 2. X Protocol: 클라이언트는 IPC를 이용하여 서버의 장치 입출력을 제어한다. 이러한 X서버와 X클라이언트의 상호 작용은 메시지 교환을 통해 이루어지는데, 메세지 형태와 사용법을 X 프로토콜이라 한다. 이는 서버와 클라이언트 사이에서 통신되는 Request, Reply, Event, Error의 기본 메세지이다.


 3. Xlib, Xtoolkit: Xlib는 1985년에 개발된 C언어로 구현된 클라이언트 라이브러리로 X 서버와 대화를 해주는 역할을 담당한다. X Protocol은 Xlib라는 라이브러리 루틴으로부터 발생시키는데, 허나 Xilb의 기능은 화면에 그림을 그리고 마우스에 반응하는 등의 기능 밖에 없는 저수준 인터페이스이다. 그래서 상위 라이브러리인 X toolkit을 사용하는데, XtIntrinsics, Xaw, XView, Motif, Qt, GTK 등이 있다.


2) XFree86: IBM PC에 호환되는 첫 번째 X 윈도우 시스템인 X386을 오픈소스 소프트웨어로서 개발을 지속하기 위해 1992년 9월에 시작되었고 이후 이식 버전에서 인기를 얻어 표준으로 자리를 잡았지만, X11R6.5.1 버전이 발표되면서 X서버의 개발은 중단 위기로 자리잡았었다. 이때 XFree86 프로젝트가 기술 혁신을 이끌었고 X.Org 명예 회원으로 참여 했다. 그 이후 X11R6.6을 업그레이드 하면서 XFree86의 4.4c2 버전을 포함 시켰고, 그 결과 GPL에 상응하는 라이선스를 가지는 X.org 서버 X11R6.7이 발표되었다. 

3) X.org: X.org 재단은 2004년 4월 5일에 X11R.6.7인 X.Org 6.7을 발표하였다. 이후 주요 소스코드를 리팩토링하여 EXA를 포함한 "모듈 오토툴 버전"이 X11R7.0으로 발표되었다. X.org 6.7 버전이 발표된 시점부터 레드햇, 페도라, SuSE, 데비안 등의 리눅스 배포판에서 이것을 사용했다. 최근 X.org에서는 저수준의 Xlib대신에 XCB를 대체해서 사용하고 있다.


4) 윈도우 매니저: 리눅스를 쓸 때 GUI환경을 제공하는 Metacity, Mutter, KWin, Window Maker, TWM 등이 윈도우 매니저이다. 이는 고유한 라이브러리를 사용하는데, Motif, GTK, QT 등이며 현재 리눅스에서는 대표적으로 GTK와 QT가 각각 GNOME과 KDE에 사용되고있다.



X 윈도우 작동


1) GNOME(GNU Network Object Model Environment): 사용자가 컴퓨터를 쉽게 사용하고 설정할 수 있도록 해주는 편리한 데스크톱 환경이다. 


*특징

-콘솔의 프롬프트 상태에서 'startx'명령을 내리면 그래픽 화면이 실행되는데, 에러가 발생했을때 'Xconfigurator'로 설정해준다.

-전용 윈도우 매니저가 없는 대신 대응 윈도우 매니저를 선택하여 사용한다.

-사용자가 원하는 방법으로 데스크톱 환경을 마음대로 설정할 수 있으며 세션 관리자는 이전 설정을 기억해 항상 그환경이 유지되도록 해준다.

-그놈과 호환이되지 않는 프로그램들의 기능도 충분히 살릴 수 있도록 여러 가지의 드래그 앤 드롭 프토로콜을 지원한다.

-GTK+(GimpTool Kit) 라이브러리를 기반으로 만들어지고 있다.

-코바(CORBA)를 사용하여 소프트웨어들의 작성언어나 실행 가능한 기계와 상관없이 상호간에 동작이 가능하게 해준다. - (종속적인 동작 X)

-노틸러스(Nautilus)라고 하는 그래픽 환경에서 시스템의 파일들을 관리할 수 있도록 해주는 파일 관리자를 가지고 있다.



2) KDE(The K Desktop Environment): 리눅스의 윈도우 환경 중의 하나이다. - (관련 라이브러리: QT)


*특징

-기본적으로 플라즈마(Plasma)라고 하는 작업환경을 기초로 하고 이것에서 다양한 애플리케이션을 사용할 수 있다. 

 (데스크탑 환경, 넷북환경, 패드와 스마트폰을 위한 액티브 환경)

-KDE의 주요 구성: 패널(pannel), 데스크탑(Desktop), 폴더 뷰(floder view), 플라즈마 툴박스(Plasma toolbox)



윈도우 매니저의 종류


 twm

 MIT의 윈도우 매니저에 반기를 든 윈도우 관리자로서, vtwm, ctwm, tvtwm, piewm, fvwm과 같은 

많은 다른 윈도우 관리자의 조상이며, 최초의 ICCM 윈도우 관리자

 dxwm 

 DEC의 윈도우 매니저

 hpwm 

 3d look의 HP 윈도우 매니저 

 mwm 

 osf/motif 툴킷에 포함된 윈도우 매니저 

 tekwm 

 tektronix의 윈도우 매니저 

 olwm 

 SUN Microsystems, Inc.의 오픈 윈도우에서 사용했던 표준 윈도우 매니저 

 pswm 

 SUN의 postscript 기반의 윈도우 매니저 

 vtwm 

 swm에 가상 데스크탑 기능을 추가한 윈도우 매니저 

 tvtwm 

 twm에 가상 데스크탑 기능을 추가한 윈도우 매니저 

 olvwm 

 olwm에 vtwm 스타일의 가상 데스크탑 기능을 추가한 윈도우 매니저 

 mvwm

 osf의 mvm에 vtwm 스타일의 가상 데스크탑 기능을 추가한 윈도우 매니저 

 fvwm 

 twm에서 파생된 윈도우 매니저로 적은 메모리를 사용하는 장점이 있지만,

많은 icon과 module을 사용하면 메모리가 급격히 늘어나는 단점이 있음. 가상 데스크톱 지원 

 fvwm2 

 fvwm에 기능을 추가시킨 윈도우 매니저. 다중 데스크탑 기능, 키보드 가속기능 등 제공

 fvwm95 

 fvwm에 기반을 둔 윈도우 매니저로 사용메뉴와 방식이 윈도우 95와 거의 같게 되어 있음

 AfterStep 

 원래는 보우맨이라는 윈도우 매니저로, 보우맨은 fvwm을 기반으로 한 윈도우 매니저. 

afterstep은 넥스트스텝의 룩앤드필을 제공하며, 유용하고 실제적인 기능을 더한 매니저

 elightenment 

 사용자들이 각자의 규칙에 따라 기능적인 부분에서 겉모습에 이르기까지 아주 작고 세밀한 부분까지 설정할 수 있음.

DR16, Foundation, DR17등 3가지 컴포넌트로 구성되어 개발되고 있음 

 windowmaker 

 afterstep과 함께 nextstep을 흉내낸 또 하나의 윈도우 매니저. GNOME에 기반을 두었고, 넥스트스텝을 닮음 

 Blackbox 

 넥스트스텝의 인터페이스를 기반으로 했지만 장식 기능이 많지 않아서 넥스트트랩에 비해 빠름 

 Metacity 

 GNOME 2.x 버전의 기본 윈도우 매니저 

 Mutter 

 GNOME 3.x 버전의 기본 윈도우 매니저 

 kwm

 KDE 1.x의 기본 윈도우 매니저 

 KWin 

 KDE 2.x 부터 현재까지의 윈도우 매니저 



윈도우 매니저의 변경

참조 파일: /etc/x11/xinit 이하에 X윈도우와 관련된 설정파일들이 존재하는데, 이 파일들 중에서 /etc/x11/xinit/xinitrc 파일의 설정을 처음으로 참조하게 되어있다. 그리고 이 파일은 사용자의 홈디렉토리 아래의 .Xclients를 참조하여 사용자가 선택한 윈도우 매니저를 실행한다. 또한, 사용자가 설정한 윈도우 매니저가 없는 경우 /etc/x11/Xclients 스크립트에 설정된 내용을 참조하게 된다. 이 파일은 시스템의 모든 사용자를 위한 기본 윈도우 매니저에 대한 설정이 되어있다. 이 스크립트는 /etc/sysconfig/desktop 파일에 설정된 윈도우 매니저를 실행하도록 하는데, 이 파일에 특정한 설정이 없는 경우 GNOME을 실행하고, 이것이 없다면 KDE를 실행한다. 만약 둘다 설치되어있지 않다면, twm이라는 기본 윈도우 매니저가 실행된다. 따라서 모든 사용자를 위한 기본 윈도우 매니저 설정을 위해선 '/etc/sysconfig/desktop' 파일을 편집해야한다.



II. 쉘(Shell) - (매년 출제)


쉘의 이해: 리눅스&유닉스 시스템의 내부 구조를 크게 나눈다면 그림과 같이 4가지로 구분할 수 있다. 쉘은 리눅스의 핵심인 커널과 사용자를 연결해주는 인터페이스 역할을 하는데, 키보드를 통한 사용자의 요청에 따른 명령어를 해석하여 커널에 전달해 주고 커널의 처리 결과를 사용자에게 전달해주는 명령어 해석기 역할을 한다.



쉘의 기능


-대화형(Interactive) 사용: 사용자의 요청을 기다려서 요청 즉시 결과값을 출력해주는 대화형 구조를 가진다.

-프로그래밍: 복합적인 잡업을 수행할 수 있도록 일련의 명령어들을 묶어서 사용할 수 있다. 이러한 프로그래밍된 파일을 스크립트(script)라고 한다. 쉘들에 내재된 명령어는 /bin이나 /usr/bin에 위치하고 있는 시스템 커맨드들과 동일하게 작동한다. 스크립트는 바이너리로 컴파일되지 않고 그대로 쉘에 의해서 해석되어 실행될 수 있다.

-리눅스 세션의 설정: 리눅스 세션에 대한 변수들을 정의하여 리눅스환경을 자신이 원하는 상태로 설정할 수 있는데, 환경 설정 파일을 수정함으로써 사용자와 시스템의 동작 환경을 쉽게 변경할 수 있게 한다.



쉘의 종류


1) 본 쉘 계열의 쉘

 이름

 개발자

 개발연도 

 특징

 sh(bourne shell)

 Steven Bourne 

 1979년 

 -가장 기본적인 쉘로 유닉스의 초기부터 사용되어 온 쉘

 -스크립트 지원

 -대화식 방식 지원 X

 ksh(korn shell)

 Dave Korn 

 1986년 

 -본 쉘을 확장판

 -명령어의 히스토리, 엘리어스, 작업제어 기능이 추가

 -유닉스에서 가장많이 사용되는 쉘

 - 명령행 편집 기능 제공

 bash(bourne again shell)

 Brian Fox 

 1989년 

 -리눅스에서 가장 많이 사용되는 쉘

 -C 쉘과 콘쉘의 장점을 결합

 -본 쉘 문법의 명령어 셋을 제공하여 본 쉘과 호환되는 쉘로   GNU 프로젝트에 의해 만들어지고 배포됨

 -명령행 편집 기능 제공 


2) C 쉘 계열의 쉘


 이름

 개발자

 개발연도 

 특징

 csh(C Shell)

 Bill Joy

 1981년 

 -명령행 편집 기능 제공 X

 -C 언어 위주의 쉘로 처음 작성되었을 때 본 쉘이 가지지 못한 기능(작업제어, 명령행) 들을 가지고 있었기 때문에 많이 사용 됨

 tcsh(TC Shell)

 Ken Greer

 1982년 

 -csh의 기능을 강화한 쉘로 C Shell의 확장판

 -명령행 편집 기능 제공



쉘의 설정 파일 및 변경


 1) 쉘의 경로 설정 파일 - /etc/shells

 

 2) 사용자가 사용하는 쉘 확인하기 - /etc/passwd

 3) 현재 사용 중인 쉘 확인 - echo $SHELL

 



쉘의 활용


쉘 환경에서의 유용한 기능들

-명령 완성 기능: 명령어 일부만 입력하고 <Tab>을 입력하면, 자동 완성된다.

-화살표 키로 사용했던 명령어 찾기: 화살표 위아래 버튼으로 입력 했던 명령어를 찾을 수 있으며, '~/.bash_history'에 저장되어 있다. 그리고 저장되는 명령어의 개수는 HISTSIZE 변수(/etc/profile에서 설정)로 결정 된다.

-마우스로 텍스트 복사: X 윈도우를 사용하는 경우, 마우스로 원하는 텍스트를 드래그해서 복사 붙여넣기가 가능하다.

-여러개의 콘솔 화면 사용

-명령어에 메타 문자 사용

 문자

  의미 

 > 

 표준출력 파일을 파일에 기록하는 출력 리다이렉션 기호

 >>

 표춘출력을 파일 끝에 덧붙이는 출력 리다이렉션 기호 

 < 

 파일로부터 표준 입력을 읽는 입력 리다이렉션 기호 

 * 

 0개의 이상의 문자와 일치하는 파일 치환 대표 문자 기호 

 ? 

 단일 문자와 일치하는 파일 치환 대표 문자 기호 

 | 

 어떤 프로세스의 출력을 다른 프로세스의 입력으로 보내는 파이프 기호 

 ; 

 명령 순서에 사용할 경우에 사용되는 기호 

 || 

 이전의 명령이 실패하면 실행하는 조건부 실행 기호 

 && 

 이전의 명령이 성공하면 실행하는 조건부 실행 기호 

 & 

 명령어를 백그라운드로 실행하고자 할 경우에 사용되는 기호 

 # 

 # 문자에 뒤따르는 모든 문자들을 주석 처리할 경우 사용되는 기호 

 $ 

 변수 접근 기호 




쉘 환경 설정


설정 파일 종류와 로그인 과정

사용자 쉘 환경 설정 파일 - 시스템 전역 설정 파일(/etc 아래의 profile, bashrc이고 /etc/profile.d 아래에 확장 파일을 둔다.

사용자별 설정 파일 - .bash__profile, .bashrc, bash_logout등이 사용되고, 쉘에서 작업기록이 .bash_history에 남게 된다.


사용자가 로그인하여 쉘 프롬프트가 나오는 과정-Bash쉘

  1. login: 프롬프트에서 자신의 ID & Passwd 입력
  2. /bin/login 프로세스는 해당 사용자 인증 관련파일(/etc/passwd, /etc/shadow, /etc/group등) 참조하여 기본정보(ID,Passwd,UID,GID, 등)들 확인
  3. /bin/login 프로세스는 로그인이 끝나면 쉘환경을 제공할 것을 요구하고, 이때 bash쉘이 실행
  4. bash쉘은 해당 사용자에 대한 시스템 전체 환경을 제공하기 위해 /etc/profile을 불러들여 사용자에게 적용
  5. 개인 환경 설정을 위해 사용자 홈 디렉터리의 .bash_profile을 불려들여 적용 한다.  파일이 없을 시(.bash_profile ▶ .bash_login ▶ .profile)
  6. 사용자 홈 디렉터리에 .bashrc 파일이 있으면 파일을 불러들여 사용자에게 적용하고 /etc/bashrc 파일이 있으면 이파일도 적용
  7. 위 과정 후 bash쉘은 사용자에게 리눅스 서버의 사용을 위한 쉘 프롬프트 제공
  8. 로그인했던 사용자가 작업을 마치고 'exit'로 로그아웃 할때에는 사용자 홈디렉터리의 .bash_logout을 불려 들여 적용
각종 파일 - (/etc/profile, /etc/bashrc, /etc/profile.d/*.sh)
  • /etc/profile: 시스템 전역 초기화 파일로서 로그인 쉘에서 실행한다. /etc/bashrc와 함께 시스템의 일반적인 설정을 하는데, bashrc보다는 더 일반적이다.
  • /etc/bashrc: 시스템 전체 환경과 시스템 부팅할때의 시작 프로그램 설정, 로그인 셋업 기능과 alias 들에 정의 하는곳이다. (alias는 전체 설정보다는 개인 설정이 더 낫기 때문에 /etc/skel/.bashrc 에서 설정)
  • /etc/profile.d: 이 디렉터리 아래엔 시스템의 내부의 각각의 설정을 sh라는 확장자를 가진 파일로 설정한다. 필요 시 다른 설정들도 하나의 파일로 이곳에 확장해서 해줄 수 있다.

    개별 설정 파일 - (.bash_profile, .bashrc, .bash_logout)
    • .bash_profile: 각 사용자의 홈디렉터리에 존재하는 파일로서 사용자의 로그인 과정에서 /etc/profile 다음에 읽혀져 개별적용 시 사용되는 파일이며, 터미널 설정과 환경변수, 초기 실행 프로그램과 같은 항목들이 설정되고, 로그아웃 전까지 유지된다.
    • .bashrc: 사용자가 정의한 변수, alias, 함수 등과 같은 사용의 용이성을 위해 필요한 항목들이 있는 파일이다. .bash_profile은 처음 로그인시에만 실행되는 것과 달리 .bashrc 파일은 쉘이 실행될 때 마다 실행된다. /etc/bashrc이 있는 경우 이 파일을 불러들여 개별 사용자에게 적용한다.
    • .bash_logout: 사용자가 로그아웃 할 때 실행할 것들에 대해 정의하는 파일이다. 이 또한 개별적 설정이 가능하며, 기본 설정 마지막엔 clear명령어가 있다. 사용자에 의해 사용되었던 임시파일들을 삭제하고 명령어 히스토리를 저장하고, /var/log/wtmp 파일에 로그아웃 시간정보를 기록하는 등의 실행설정이 가능하다.

    환경변수: 쉘에서 사용되는 매개변수는 시스템에 이미 정의되어 있는 것과 사용자에 의해 정의되는 것 두가지를 둘 수 있는데, 적절히 혼합사용이 가능하다. 쉘 변수는 리눅스 자체에 의해 만들어 지고 유지되며, 이들은 앞에 $와 함께 적어서 사용한다. .env 명령에 의해 이들 정보를 알 수 있다.


     LOGNAME 

    로그인 이름 

     IFS 

    내부 필드 구분자(Internal Field Separator)는 확장 후에 단어를 분리하고 read 내부 명령으로 읽은 행을 분리할 때 사용된다.

    기본값: "<스페이스><탭><개행문자>". 

     PATH

    명령을 찾을 검색 경로로, 쉘이 명령을 찾아 볼 디렉토리 목록을 콜론으로 구분하여 지정한다.

    기본값: "/usr/gnu/bin:/usr/local/bin: /usr/ucb:/bin:/usr/bin:"  

     HOME

    현재 사용자의 홈 디렉터리이다.

     CDPATH 

    cd 명령에서 사용하는 검색 경로로, cd 명령에서 사용한 목적지 디렉터리를 찾아 볼 디렉터리를 콜론으로 구분하여 적는다.

    기본값: ".:~:/usr" 

     ENV

    bash가 쉘 스크립트를 실행할 때 매개변수가 설정 되어 있으면, 그 값은 .bashrc와 같이 쉘을 초기화하는 명령을 담고있는 파일의 이름으로 해석한다.

     MAIL

    이 매개변수가 파일이름으로 설정되어 있고 MAILPATH 변수는 설정되어 있지 않으면, bash는 이 파일을 보고 메일의 도착 여부를 사용자에게 알려준다.

     PS1 

    이 매개변수의 값을 확장하여 주 프롬프트 문자열로 사용한다.

    기본값: "bash\$" 

     PS2 

    이 매개변수의 값을 확장하여 2차 프롬프트 문자열로 사용한다.

    기본값: ">". 

     TERM 

    터미널 타입을 확인한다. 만약 vi로 편집 시, 이 변수 설정은 매우 중요하다. 

     TERMINFO

    터미널에 대한 정보를 위해 검색된 디렉터리를 보여준다. 

     TZ 

    지역시간(Time zone)을 정의한다.
    기본값: "EST5EDT" 

     PWD

    현재 디렉터리를 뜻한다. 



    환경변수 값 확인 및 설정

     하나씩 확인

     # echo $변수명, # printenv 변수명 

     

     현재 설정된 변수 값 모두 확인

     # printenv, # env 

     환경 변수 값 설정/변경

     # env PATH=/home:$PATH, # export PATH=/home:$PATH




    I/O Redirection


     >, >>: 임의의 파일을 작성하거나, 덧붙여 수정할 때 사용

     # cat > test
     이 문구는 방금 추가한 내용입니다. [ENTER]
     [Ctrl+D]
     # cat test
     이 문구는 방금 추가한 내용입니다. [◀작성된 내용]

     # cat >> test
     이 문구는 덧붙인 내용입니다. [ENTER]
     [Ctrl+D]
     # cat test
     이 문구는 방금 추가한 내용입니다.
     이 문구는 덧붙인 내용입니다. [◀추가된 내용]

     <: 파일의 내용을 출력할때 사용

     # cat < test

     이 문구는 방금 추가한 내용입니다.

     이 문구는 덧붙인 내용입니다.

     [▲cat test와 같은 결과]

     표준 에러: 어떠한 명령을 내렸을때 그러한 명령을 찾을 수 없다고 뜨는 에러메세지

     # jun
     -bash: jun: command not found
     # jun 2> error [◀2는 표준에러를 뜻하는 파일 기술자 (0=표준입력, 1=표준출력)]
     # cat error
     -bash: jun: command not found [◀저장된 에러메세지 출력]


     ex) /(루트) 아래에서 중간에 'linux'라는 단어을 포함하는 모든 파일을 찾아 new라는 파일에 저장하고 에러 메세지는 err이라는 파일에 저장하려는 경우의 명령어

     $ find / -name *linux* 1> new 2> err

     cat new를 사용하면 linux를 포함하는 모든 파일을 보여줄것이고, cat err을 하면 접근 거부가된 에러메세지를 볼수 있다.


    방향 재지정 방법 정리


    기호 

    Bourne shell 

    C shell 

     표준 출력을 파일로 나타낸 기호 

     표준 출력을 새로운 파일로 나타낸 기호 

    >!-d

     사용하지 않는다는 기호 

     표준 출력을 기존의 파일로 나타낸 기호 

    >> 

     표준 출력을 기존의 파일에 덧붙이거나 새 파일로 출력 

     표준 출력을 기존의 파일에 덧붙임 

    <

     표준 입력을 파일에서 받음 

     표준 입력을 파일에서 받음 

    >& 

     사용 X 

     표준 출력, 에러를 새로운 파일로 출력 

    >&! 

     사용 X

     표준 출력, 에러를 기준의 파일로 출력 

    >>& 

     사용 X 

     표준 출력과 에러를 기존의 파일에 덧붙임 

    1>

     표준 출력을 파일로 출력 

     사용 X 

    2> 

     표준 에러를 파일로 출력 

     사용 X 

    >&2 

     표준 출력, 표준 에러를 결합하고, 결과를 표준출력으로 출력 

     사용 X 


    ex) 표준 출력을 표준 에러로 보내기 - (표준 출력을 지정된  파일에 기록하는 대신 표준 에러출력으로 보이게 하기)

    $ grep da * 1>&2 

    ex) 표준 에러를 표준 출력으로 보내기 - (표준 에러의 출력을 지정된 파일에 기록하는 대신 표준 출력으로 보이게 하기)

    $ grep * 2>&1 

    ex) 표준 에러와 표준 출력을 파일로 보내기 - (명령어 실행 된 이후 결과로 모든 출력을 /dev/null 파일로 보낼 것이므로 시스템엔 아무런 정보다 남지 않음)

    $ rm -f $ (find / -name core) &> /dev/null



    파이프라인


    파이프라인 개념: 파이프는 한 명령의 출력을 다른 입력으로 보내는 툴이며, '|'가 파이프 심볼이다. 그리고 파이프라인이란 '|'의 파이프 문자로 구분된 한 개 이상의 명령이 연속되어 나오는 것을 말한다.


     # 명령어1 | 명령어2 | 명령어3 

     명령어1의 출력결과가 명령어2의 입력이 되고, 또 명령어2의 출력결과가 명령어3의 입력이된다. 


     ex) 현재 시스템을 사용중인 사용자들을 찾고, 그 다음으로 그것들을 정렬시켜서 출력하라. 

     # who | sort

     ex) ls -al 명령어를 사용해서 파일, 디렉터리 목록들이 한 화면씩 쉽게 볼수 있도록 하라. 

     # ls -al | more 



    III. Shell 프로그래밍



    스크립트 작성


    1) 변수의 속성 정의


    위치 매개 변수: 0 하나만 적는 것을 제외하고 숫자로 지시하는 매개변수를 뜻한다. 쉘이 실행될 때 인수로부터 지정되거나 set 내부 명령을 사용하여 재지정이 가능하다. 변수 지정 문장을 사용하여 지정할 수 없으며, 쉘 함수가 실행될 때 일시적으로 치환된다. 1개 이상의 숫자로 구성된 위치 매개 변수를 확장할 때에는 중괄호로 묶어 주어야 한다.


    특별 매개 변수

     기호

      내용 

     *

     1부터 시작하여 위치 매개변수로 확장한다. 더블 쿼우트에서 확장이 이루어지면 각 매개변수 값을 한 단어로 확장한다.

     ("$*" = "$1c$2c..." [c는 IFS 변수의 첫번째 문자])

     @ 

     1부터 시작하여 위치 매개변수로 확장한다. 더블 쿼우트에서 확장이 이루어지면 각 매개변수가 개별적인 단어로 확장한다.

     ("$@" = "$1" "$2" ...) 

     # 

     십진수로 위치 매개 변수의 확장한다.

     ? 

     최근에 실행된 포그라운드 파이프라인의 상태값으로 확장한다. 

     -

     실행하자마자 set 내부 명령을 통하거나, 쉘 자체에 의해 설정된 현재 옵션 플래그로 확장한다.

     $ 

     쉘의 프로세스 ID로 확장한다. 

     ! 

     최근에 실행한 백그라운드 명령의 프로세스 ID로 확장한다. 

     0 

     쉘, 쉘 스크립트의 이름으로 확장한다. 

     _ 

     지난 명령의 마지막 인수로 확장한다. 

        


    쉘 변수: 쉘의 환경 변수로서 리눅스 자체에 의해 만들어지고 유지되는데, 이들은 앞에 $와 함께 적어서 사용한다(ex. $ENV). 


    사용자 정의 변수 사용


    사용자 정의 변수 선언 시 규칙

    -첫 글자는 영,숫자 일 것: A-Z, a-z, 0-9, _

    -길이제약은 없지만 너무 길게 하지 말 것

    -대.소문자 구분 

    ex) aaa라는 변수에 "Hello World" 문자를 저장 후 출력 



    [root@bjkim ~]# if [ $LOGNAME != root" ]

    > then

    > echo "Sorry. It is allowed to root user ..."

    > exit 1

    > fi

    > find /dev -type f -exec ls -l {} \;



    2) 복합 명령


     if문

     if [조건식];

     then

       {결과가 참일 때 수행할 명령문}

     fi

     결과가 참일 경우 종료값으로 0을 반환 후 then 이후 문장을 실행되고, 결과가 거짓일 경우는 1을 반환 후 fi로 if문을 종료하게 된다. 

     if [ $LOGNAME != root" ]

     then

       echo "Sorry. It is allowed to root user ..."

       exit 1

     fi

     find /dev -type f -exec ls -l {} \;


     특정 쉘 프로그램을 root권한으로만 실행가능하도록 하기 위하여 쉘프로그램 초기 root 사용자임을 확인하여 아닐경우 메세지를 출력후 쉘프로그램을 종료하고, root 사용자일경우는 쉘프로그램을 실행 하게끔 하는 예

     if [조건식1];

     then

       {참일 때 수행할 명령문1}

     elif [조건식2]

     then

       {참일 때 수행할 명령문2}

     else

       {위 모든 조건이 거짓일때 실행할 명령문3}

     fi

     기존 if 구문에 else 추가하여 적용


     case문

     case $변수 in

     값 1)

     변수의 값이 1일 경우에 실행될 명령문

     ;;

     값 2)

     변수의 값이 2일 경우에 실행될 명령문

     ;;

     값 3)

     변수의 값이 3일 경우에 실행될 명령문

     ;;

     ...

     *)

     위의 해당사항이 없을 경우에 실행될 명령문

     ;;

     esac

     사용자가 입력한 변수의 값이 "값 1"과 일치할 경우 그 뒤의 명령문이 실행되고, "값 2"와 일치할 경우는 그뒤 ... 해당 되는 값이 없을 경우엔 *) 뒤에 있는 명령문들이 실행된다. 그리고 esac는 case문의 종료를 의미한다.

     echo Select MENU to run A, B, C, D :

     read point


     case $point in

     A)

     echo You select A MENU

     ;;

     B)

     echo You select B MENU

     ;;

     C)

     echo You select C MENU

     ;;

     D)

     echo You select D MENU

     ;;

     *)

     echo select A, B, C, D

     ;;

     esac

     A, B, C, D 메뉴에서 사용자가 선택한 문자를 입력 받아 그에 맞는 실행을 하게 되는 예


     for문

     for {변수} in {반복하여 사용될 값들}

     do

       반복되는 동안 실행될 명령문들

     done 

     "변수"는 for문이 반복되는 동안에 사용될 인자이며, in 뒤에 있는 "반복 ~ 값들"은 for문이 반복되는 동안 각각의 값들이 "변수"에 치환된다. 그리고 do~done는 반복되는 동안 안의 명령문들이 한번씩 실행된다.

     for var1 in 1 2 3 4 5

     do

       echo var1 value is $var1

     done 

     for문이 한번씩 반복될 때마다 var1의 값은 1, 2, 3, 4, 5로 각각 치환되어, 모두 5번의 do~done내의 명령문이 실행되는 예 


     while문

     while (조건문)

     do

       반복되는 동안 실행될 명령문

     done 

     조건식이 참(True = 0)일 경우, "do ~ done"의 내용을 반복적으로 실행하고 거짓(False)일 경우 while문을 종료한다. 거짓인 경우가 미설정 시 무한루프가 된다.

     var1=0

     while ($var1 < 5)

     do

       echo var1 value is $var1

       let var1+=1

     done 

     var1에 0으로 초기값을 설정한 후, 조건식 "$var1<5" 에 따라 var1이 5와 같거나 클경우, while문을 종료하고 done 다음 실행문으로 넘어는 내용들여서, var1의 값이 5보다 작을 동안 반복문이 계속 실행되는 예 



     until문

     until {조건문}

     do

       조건문이 거짓일 동안 실행될 명령문

     done 

     의미는 while문과 비슷하지만, 조건문의 의미가 상반된 경우이다. 즉, until문은 "참이 될 때까지" 실행되는 것을 의미하지만, while문은 "참일 동안" 실행되는 것을 의미한다.

     var1=0

     until (($var1 ==5))

     do

       echo var1 value is $var1

       let var!+=1

     done 

     var1에 0으로 초기값을 설정한 후, 변수값이 5값이 5가 될때까지 반복문을 실행하는 예


     select문

     select 변수 in 메뉴리스트

     do

       실행될 명령문

     done

     select문은 메뉴방식의 반복문으로 동작하는 쉘프로그램을 만들고자 하는 경우에 사용하는데에 최적인데, 작성 시 PS3이라는 쉘변수를 사용하는데, PS#에 지정된 메시지를 화면으로 출력하고 사용자의 입력을 기다린다. select문이 실행되면 in 다음의 메뉴리스트에 번호를 붙여 화면으로 출력한다. 그리고 선택된 번호가 지정되면 변수의 메뉴리스트에서 선택된 해당리스트를 저장한 다음 반복문이 실행된다. 특별 명령어가 저장되어 있지않다면, CTRL+C를 만날때까지 무한루프를 돈다.

     pg1=w

     pg2=id

     pg3=who

     pg4=date

     pg5=ls


     PS3="Select NUMBER to run program :"


     select systemcheck in $pg1 $pg2 $pg3 $pg4 $pg5

     do

       echo ###$systemcheck COMMAND running .. ###

       $systemcheck

       echo

       echo

       echo ENTER to list MENU

     done

     pg1부터 pg5까지의 변수를 지정하고, PS3은 지정된 메세지를 화면으로 출력하고 사용자의 입력을 기다리고, in 다음에 지정된 pg1부터 pg5까지 메뉴리스트에 번호를 붙여 화면으로 출력하고, 사용자가 선택된 번호가 지정되면 변수의 메뉴리스트에서 선택한 해당 리스트를 저장한 다음 반복문이 샐행되는 예


     함수

     function 이름() {

       처리할 명령문

     } 

     특정한 이름의 함수를 정의하고, 해당 이름이 나올때 마다 {}안의 명령문이 실행된다.

     function hello {

       echo Hello World!

     }

     

     hello

     hello 

     hello 함수가 호출되면, "Hello World!"가 출력되는데, 밑에서 2번 호출 해서 2번의 "Hello World!"가 출력되는 예 

     function quit {

       exit

     }

     

     function hello {

       echo Hello!

     }

     

     hello

     quit

     echo foo

     hello를 호출하고 "Hello!"를 출력하고 quit을 호출해 exit로 종료해서 echo foo 문장은 실행되지않고 종료되는 예