OS Util TIps/Unix Linux

[펌] ksh 100% 활용

시처럼 음악처럼 2007. 3. 16. 14:54
퍼온곳 : http://unix.co.kr/stories.php?story=02/01/30/1019463

ksh의 환경변수 설정은 csh와 다르다.
1. 환경 변수의 선언
%> var='변수의 내용' #사용 예
var : 환경변수 이름
= : 환경변수와 변수 내용을 구분. 이 때 =의 전후에 공백이 있으면 안된다.
=의 오른쪽 : 이곳이 환경변수에 기억되는 내용이다. 작은 따옴표는 변수의
내용에 공백이 있는 경우에 사용한다.
일반적으로 항상 붙이면 문제가 없다.

2. export
환경변수는 현재 프로세스에서만 사용할 수 있는 변수와 하위 프로세스에서
도사용할 수 있는 변수로 구분된다. 하위 프로세스도 사용할 수 있는
변수는 상위 프로세스가 하위 프로세스에 어떤 정보를 전달/공유하기 위하여
사용된다.
이러한 작업을 export라고 부른다.

%> export var #사용예
필요한 변수를 선언한 다음에 export명령 뒤에 변수명을 주고 실행한다.
보통 shell의 환경설정을 위한 변수는 항상 export되어야 한다.

3. 환경변수의 사용
%> N='var'
%> echo $N # $기호를 분여서 사용한다.
var
%> echo $Nvar # NVar이라는 환경변수를 찾기 때문에 아무것도
# 출력하지 않는다.
%> ehco ${N}Var # 환경변수명을 {}로 감싸면 N만 환경변수로 인식하

varVar # Var은 일반 문자로 인식하고 처리한다.

** 참고 : $문자를 그냥 화면에 출력하고 싶으면 백슬러쉬(\)를 사용한다.
%> echo \$N
$N

4. 어떤 프로그램의 실행결과를 환경변수에 저장
환경변수를 선언할때 작은 따옴표 대신 역따옴표(키보드에 ~와 함께 있는
문자)를 사용하면 역따옴표로 둘러싸인 문장이 실행된 결과가 환경변수에
저장된다.
이 방법은 shell에서 수식을 계산하거나 디렉토리를 탐색하는 등의 shell
script에서 유용하게 사용되는 기능이다. 실전적인 예는 다음에 자세히
다룬다.
%> DIRLIST=`/bin/ls` # 역따옴표임 (작은 따옴표 아님)
%> echo $DIRLIST # 디렉토리의 파일 목록이 공백문자로
# 구분되어 있다.

5. export되는 환경변수를 짧게 선언하기
export되는 환경변수를 정의하려면 다음과 같이 해야한다.
%> DIR='$HOME/work'
%> export DIR

이걸 다음과 같이 하면 한번에 할 수 있다.
%> export DIR='$HOME/work'
================================================================================
DOS의 autoexec.bat과 같은 기능을 하는 파일이 .profile 이다.
sh, csh, ksh 모두 login시 사용되는 shell script 파일을 가지고 있다.
sh와 ksh는 .profile을 사용하고 csh는 .cshrc를 사용한다.

.profile은 DOS의 autoexec.bat과 같다고 생각하고 사용하면 된다. 내가 처음
login할때 실행되도록 하고 싶은 프로그램이나 필요한 환경변수의 선언을 이곳에
적어준다.

1. .profile을 다시 실행
일단 login한 후 .profile을 수정하면 다음번 login부터 수정한 내용이
적용된다. DOS의 경우 autoexec.bat을 다시 실행시켜주면 되지만 UNIX는
그렇게 되지 않는다.
이때는 .(점)을 사용한다.
%> . .profile $ .(점) .(점)profile
이렇게 하면 login시에 실행한 것과 동일한 효과를 발휘한다.
csh에서는 source .cshrc 하고 실행하면 된다.

2. .profile에 많이 사용되는 내용.
export PS1='$PWD:\!> ' # Prompt 설정

set -o vi # ksh의 command line에서 vi key를 사용
EXINIT='ai ts=4' # vi 사용 환경을 초기화 하는 환경변수
stty erase ^H # backspace를 [Del]대신 [<--]로 변경
alias ls='ls -aFs' # ls 명령 재지정
alias rm='rm -i' # rm 명령 재지정
alias cp='cp -i' # cp 명령 재지정

stty cs8 -istrip # terminal에서 한글처리가 되도록 지정

export PATH=$PATH:. # current dir을 PATH에 지정

HOME은 현재 사용자의 login 디렉토리를 지정하고 있는 환경변수이다.
1. 아래는 HOME을 사용하는 몇가지 예이다.
%> echo $HOME
/home/tradeoff
%> cd $HOME/bin # /home/tradeoff/bin 으로 이동
% PATH=$PATH:$HOME/bin # PATH에 자신만의 명령을 넣어 두는 디렉
토리인
# /home/tradeoff/bin 을 추가.

2. ~ ($HOME의 다른 형태)
~ 는 ksh에서 사용가는한 $HOME에 다른 형태이다. 어디서든 $HOME을 사용
해야
하는 자리에는 대신에 ~를 사용할 수 있다.
%> echo ~
/home/tradeoff
%> cd ~/bin
% PATH=$PATH:~/bin

3. 다른 사용자의 HOME 디렉토리 지정.
다른 사용자의 HOME 디렉토리를 입력할 때도 ~ 를 사용할 수 있다.
~username 이라고 쓰면 지정된 username의 HOME 디렉토리가 지정된다.
%> echo ~root # root, oracle7의 HOME 디렉토리를
%> echo ~oracle7 # 각각 출력한다.
%> cd ~goodman3 # goodman3의 HOME으로 이동한다.

천리안 웹서버들에서
http//user.chollian.net/~tradeoff 가 내 홈페이지인 것도 비숫한 형태로
사용된 것으로 보면 된다.

4. $HOME의 응용
그냥 cd라고 입력하면 사용자가 어디에 있던지 자신의 loign 디렉토리로
이동하게 된다. 이 때 사용되는 환경변수가 HOME이다.
즉 그냥 cd 는 cd $HOME 이라고 생각하면 된다.

자신의 HOME은 /home/tradeoff인데 현재 개발중인 프로젝트는
/home/project이고 모든 개발자가 이곳에서 작업을 한다고 가정하자.
아마도 개발자들은 자신의 HOME보다 개발 디렉토리인 /home/project를
더 자주 사용하게 될 것이다.
%> HOME=/home/project # 환경변수 HOME을 수정
%> cd /tmp
%> cd # 어디서든 cd를 입력하면
%> pwd # /home/tradeoff 대신 /home/project로
/home/project # 이동한다.

================================================================================
ksh의 PATH 환경변수는 실행파일을 찾을 경로를 지정해 준다.
csh에서는 path (소문자)라는 환경변수를 사용한다.

1. UNIX와 DOS의 가장 큰 차이점
DOS는 실행파일을 찾을 때 현재 디렉토리를 찾고 없으면 PATH에서 찾는다.
하지만 UNIX는 무조건 PATH에서 찾는다. 따라서 현재 디렉토리( . (점))가
PATH에 지정되어 있지 않으면 현재 디렉토리의 파일을 실행할 때
%> ./exe_file
로 실행해야 한다.
다음의 내용을 .profile에 지정하는 것이 사용이 편리하다.
PATH=$PATH:. # 제일 끝에 점(.)을 추가한다.

2. 처음 C 로 만든 프로그램의 이름을 test로 만든경으
간단한 C 프로그램을 작성하고 그 실행파일 이름을 test로 하는 사람들이
많다. 이런 경우 프로그램이 아무일도 하지 않는 경우가 종종 발생한다.
다음은 그런 경우를 발생시키는 예이다.
%> cc -o test test.c # test.c는 화면에 Hello를 출력하는 PGM
%> test
# 아무 메세지도 나오지 않는다.
다음 명령을 실행하고 test를 다시 실행해 보자.
%> PATH=.:$PATH # PATH의 제일 앞에 점(.)을 추가한다.
$> test
Hello # 정상적으로 실행된다.

왜 이런 일이 발생하는 걸까?


그 이유는 UNIX에 기본적으로 포함된 명령어 중에 test라는 명령이 이미
존재하기 때문이다. (whereis test 를 실행해 보면 위치를 알수 있다.)
UNIX에는 true, false라는 이름의 실행파일도 존재한다. test와 함께 이
명령들은 shell script를 작성시 유용하게 사용된다.
================================================================================
DOS에 doskey라는 프로그램을 실행시키면 화살표키로 이전 다음 명령으로 쉽게
이동할 수 있다는 것은 모두 알고 있을것이다.
이와 비슷하게 ksh command line을 사용하는 방법이 Editing mode이다.
set -o vi 는 vi Editing mode
set -o emac 은 emac Editing mode이다.
Editing mode가 지정되면 지정된 편집기에서 사용하던 키를 command line에서
거의 그대로 다 사용할 수 있다.
vi는 누구나 사용함으로 vi Editing mode에 대해서 설명한다.

일단 set -o vi 를 .profile 에 추가한다.
%> . .profile # 수정된 .profile을 적용한다.

이제 vi 사용법을 생각해보자. 일단 ESC를 누르면 command mode가 된다.

이때 HJKL을 누르면 왼쪽,아래,위,오늘쪽으로 각각 움직인다.
JK로 명령을 선택하고 HL로 이동하면서 일부를 수정할 수 있다.
수정하는 방법은 vi와 같다.
a: 커서 다음부터 추가
i: 커서 위치부터 추가
r: 한 문자 수정
R: 여러문자 수정
x: 한문자 삭제
dw: 한 단어 삭제
이외에 vi의 편집키는 모두 사용할 수 있다.
물론 다시 command mode가 되려면 ESC를 누르면 된다.

** 명령어 검색
/ 를 누르고 검색 조건을 입력하고 엔터를 누르면 검색이 된다.
n을 누르면 일치하는 다음 명령을 찾아온다.
이것도 역시 vi와 동일하다.

[쉬어가세요]
vi command mode의 명령 중에 xp를 아십니까?
프로그램을 하다보면 return을 rutrun으로 입력하는 경우가 많지요.
이때는 return에서 r와 u을 빠꾸면 됩니다. r에 커서를 놓고 xp를 눌러보세요.
r과 u가 감쪽같이 바뀝니다.
x는 한문자 지우가.
p는 최근에 지운문자를 커서 다음에 L이기 입니다.
알고 있었다구요?? 하지만 두개를 붙여서 활용하는 방법은 처음일 겁니다.
전 xp를 한개의 명령처럼 생각하고 사용합니다.
ddp도 비슷하게 사용할 수 있다.
================================================================================
ksh에는 두 종류의 프롬프트가 있다.
PS1과 PS2가 그것이다. PS1은 항상 사용자의 명령을 기다리는 동안 나타나는
일반적인 프롬프트를 의미한다. 하지만 PS2는 별로 본적이 없을 것이다.

UNIX의 command line에서 한줄에 모든 명령을 전부 입력할 수 없는 경우
그 줄의 끝에 \(백 슬러시)를 입력하고 엔터를 치면 다음줄에 계속해서 명령을
입력할 수 있다.
아래 예에서 '>'가 바로 PS2이다.
%> cc -o main \
> main.c lib.c -L/user/lib \
> -lm -I/home/project/inc

프롬프트를 지정하는 방법은 별로 중요하지 않으므로 그냥 제가 사용하는 방법만
소개합니다. 다음을 .profile에 추가하고 사용하면 됩니다.

PS1='$PWD:\!> ' # $PWD : 현재 디렉토리, \! : 현재 실행된 명령의수
export PS1