본문 바로가기

04번. IT 힌트얻기/▶ UNIX

Unix-basic-09(shell)

 <************************* SHELL *************************>

 

▶ls명령이 어디 있느냐
multihp1:/data2/unix/unix10>whereis ls
ls: /sbin/ls /usr/bin/ls /usr/share/man/man1.Z/ls.1

 

▶ shell이 가지고 있는 명령은 파일형태로 가지고 있지 않음
multihp1:/data2/unix/unix10>whereis if
if:

multihp1:/data2/unix/unix10>ls /usr/bin/*sh
/usr/bin/autopush  /usr/bin/csh       /usr/bin/ksh       /usr/bin/rsh
/usr/bin/c_rehash  /usr/bin/hash      /usr/bin/remsh     /usr/bin/sh
/usr/bin/chsh      /usr/bin/keysh     /usr/bin/rksh

 

▶ 로그인한 shell 확인하기
multihp1:/data2/unix/unix10>grep unix10 /etc/passwd
unix10:fyR7PgX/EpXYU:410:202:,,,:/data2/unix/unix10:/usr/bin/ksh  --> /usr/bin/ksh   로그인한 shell

 

▶ shell 변경하기
multihp1:/data2/unix/unix10>chsh unix10 /usr/bin/csh

 

▶ 사용자와 커널(OS의 핵심)간의 명령어 해석기

쉘은 로그인할 때 마다 .profile 을 읽어준다.
스크립트 작업을 shell scriptor로 하는 경우가 많다

 

▶ 현재 사용하고 있는 shell을 확인하기
1) multihp1:/data2/unix/unix10>echo $SHELL
/usr/bin/ksh
multihp1:/data2/unix/unix10>grep unix10 /etc/passwd

2)unix10:fyR7PgX/EpXYU:410:202:,,,:/data2/unix/unix10:/usr/bin/ksh
3)multihp1:/data2/unix/unix10>ps
   PID TTY       TIME COMMAND
 20483 pts/tz    0:00 ps
 18860 pts/tz    0:00 telnetd
 18861 pts/tz    0:00 ksh
 csh, ksh 즉 shell명령어는 다를 수 있다. 하지만 unix명령은 동일하다.
 
 
▶ vi를 통해서 a.ksh를 만들어줌
ls
date
who
cal
echo hi suho
~

~
~
~
~
"a.ksh" [새 파일] 6 줄, 30 자
multihp1:/data2/unix/unix10/shell>ls -l
총 2 블록입니다.
-rw-rw-rw-   1 unix10     unix            30 11월 24일 09:58 a.ksh
multihp1:/data2/unix/unix10/shell>chmod +x a.ksh
multihp1:/data2/unix/unix10/shell>./a.ksh
a.ksh
2011년11월24일 (목), 오전 9시59분25초
root       console      8월 23일 13:49
it00       pts/ta       11월 24일 08:59
it00       pts/tb       11월 24일 08:59
it08       pts/tc       11월 24일 09:50
it06       pts/td       11월 24일 09:03
unix05     pts/te       11월 24일 09:04
unix05     pts/tf       11월 24일 09:04
it03       pts/tg       11월 24일 09:32
it03       pts/th       11월 24일 09:05
it15       pts/ti       11월 24일 09:05
it10       pts/tj       11월 24일 09:07
it10       pts/tk       11월 24일 09:07
unix04     pts/tl       11월 24일 09:09
it14       pts/tm       11월 24일 09:10
it04       pts/tn       11월 24일 09:10
it04       pts/to       11월 24일 09:10
it17       pts/tp       11월 24일 09:10
it12       pts/tq       11월 24일 09:10
it05       pts/tr       11월 24일 09:10
it11       pts/ts       11월 24일 09:10
it13       pts/tt       11월 24일 09:10
unix08     pts/tu       11월 24일 09:11
it02       pts/tv       11월 24일 09:14
it15       pts/tw       11월 24일 09:41
unix11     pts/tx       11월 24일 09:11
unix03     pts/ty       11월 24일 09:11
unix10     pts/tz       11월 24일 09:11
unix00     pts/tA       11월 24일 09:11
unix11     pts/tB       11월 24일 09:12
it14       pts/tC       11월 24일 09:13
unix07     pts/tE       11월 22일 09:14
it13       pts/tF       11월 24일 09:13
unix06     pts/tG       11월 24일 09:14
it11       pts/tH       11월 24일 09:14
it05       pts/tI       11월 24일 09:14
unix08     pts/tJ       11월 24일 09:16
unix15     pts/tK       11월 24일 09:18
unix00     pts/tL       11월 24일 09:19
it07       pts/tM       11월 24일 09:21
it07       pts/tN       11월 24일 09:21
it16       pts/tO       11월 24일 09:21
unix01     pts/tP       11월 24일 09:32
unix02     pts/tQ       11월 24일 09:43
unix13     pts/tR       11월 24일 09:57
   November 2011
 S  M Tu  W Th  F  S
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
hi suho
multihp1:/data2/unix/unix10/shell>

#! --> shell 지정   --> #!/usr/bin/ksh  : vi scriptor를 짤때는 이것으로 보통시작을 한다.
#  --> 주석

▶ 실행하는 법. vi를 통해서 만들어준 b.sh를 현재 디렉토리에서 실해하는 법
multihp1:/data2/unix/unix10>cat b.sh
date
echo suho hi~~~
multihp1:/data2/unix/unix10>./b.sh
ksh: ./b.sh: cannot execute
multihp1:/data2/unix/unix10>. ./b.sh
2011년11월24일 (목), 오전 10시18분59초
suho hi~~~
multihp1:/data2/unix/unix10>ksh ./b.sh
2011년11월24일 (목), 오전 10시19분7초
suho hi~~~
내가 자주 사용하는 것을 path에 추가시켜주는 경우
multihp1:/data2/unix/unix10/shell>PATH=/usr/bin:usr/sbin:.

multihp1:/data2/unix/unix10/shell>ls > ls.out
multihp1:/data2/unix/unix10/shell>ls >> ls.out
multihp1:/data2/unix/unix10/shell>mail unix11 < ls.out
multihp1:/data2/unix/unix10/shell>cat << A
> red
> blue
> exit
> A
red
blue
exit
multihp1:/data2/unix/unix10/shell>

▶ shell에서 echo를 사용한 검색  (echo검색시 .으로 시작되는 파일은 보여주지 않음)
multihp1:/data2/unix/unix10>echo *
a aa aaa b.sh core cp.out err.out f3 f4 f5 ff1 ff2 find.out grep.out labdir labdir.cpio labdir2 labdir4 labdir5 letter ls.out mbox my.sh nohup.out public shell sort.out suho.tar.gz unix.out who.out
multihp1:/data2/unix/unix10>echo .*
. .. .profile .sh_history
multihp1:/data2/unix/unix10>echo ?
a
multihp1:/data2/unix/unix10>echo ????*
b.sh core cp.out err.out find.out grep.out labdir labdir.cpio labdir2 labdir4 labdir5 letter ls.out mbox my.sh nohup.out public shell sort.out suho.tar.gz unix.out who.out
multihp1:/data2/unix/unix10>echo ?????*
cp.out err.out find.out grep.out labdir labdir.cpio labdir2 labdir4 labdir5 letter ls.out my.sh nohup.out public shell sort.out suho.tar.gz unix.out who.out
multihp1:/data2/unix/unix10>touch 2342
multihp1:/data2/unix/unix10>touch DSFSD
multihp1:/data2/unix/unix10>echo [0-9]
[0-9]
multihp1:/data2/unix/unix10>echo [0-9]*
2342
multihp1:/data2/unix/unix10>echo [a-z]*
a aa aaa b.sh core cp.out err.out f3 f4 f5 ff1 ff2 find.out grep.out labdir labdir.cpio labdir2 labdir4 labdir5 letter ls.out mbox my.sh nohup.out public shell sort.out suho.tar.gz unix.out who.out
multihp1:/data2/unix/unix10>echo [A-Z]*
DSFSD
multihp1:/data2/unix/unix10>touch -- -a
multihp1:/data2/unix/unix10>touch -- -a
▶ -는 스크립트에서 중요하게 사용된다. 그런데 -로 시작되는 파일이 있을경우 하기와 같이 --를 함께 사용해줌
multihp1:/data2/unix/unix10>touch -- -a
multihp1:/data2/unix/unix10>ls
-a           b.sh         f5           labdir.cpio  mbox         suho.tar.gz
2342         core         ff1          labdir2      my.sh        unix.out
DSFSD        cp.out       ff2          labdir4      nohup.out    who.out
a            err.out      find.out     labdir5      public
aa           f3           grep.out     letter       shell
aaa          f4           labdir       ls.out       sort.out
multihp1:/data2/unix/unix10>^C
multihp1:/data2/unix/unix10>rm -a
rm: 잘못된 선택항목 -- a
사용법: rm [-Rfir] file ...
multihp1:/data2/unix/unix10>rm -- -a

multihp1:/data2/unix/unix10>echo date
date
multihp1:/data2/unix/unix10>echo `date`
2011년11월24일 (목), 오전 10시48분13초

▶ `(역따옴표) 사용하기  -- 명령어 대체하기
multihp1:/data2/unix/unix10>echo `date`
2011년11월24일 (목), 오전 10시48분13초
multihp1:/data2/unix/unix10>^C
multihp1:/data2/unix/unix10>
multihp1:/data2/unix/unix10>
multihp1:/data2/unix/unix10>
multihp1:/data2/unix/unix10>
multihp1:/data2/unix/unix10>
multihp1:/data2/unix/unix10>
multihp1:/data2/unix/unix10>a=date
multihp1:/data2/unix/unix10>echo $a
date
multihp1:/data2/unix/unix10>a=`date`
multihp1:/data2/unix/unix10>echo $a
2011년11월24일 (목), 오전 10시48분59초
multihp1:/data2/unix/unix10>a=$(date) <-- 역따옴표 대신 다음과 같이 사용 가능함

 


multihp1:/data2/unix/unix10>ls | grep a.ksh
multihp1:/data2/unix/unix10>who | grep unix10
unix10     pts/tz       11월 24일 09:11
multihp1:/data2/unix/unix10>ls ; date ; cal
2342         core         ff1          labdir2      my.sh        unix.out
DSFSD        cp.out       ff2          labdir4      nohup.out    who.out
a            err.out      find.out     labdir5      public
aa           f3           grep.out     letter       shell
aaa          f4           labdir       ls.out       sort.out
b.sh         f5           labdir.cpio  mbox         suho.tar.gz
2011년11월24일 (목), 오전 10시51분57초
   November 2011
 S  M Tu  W Th  F  S
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

 
multihp1:/data2/unix/unix10>echo dkdsalfjkldsfjsldf\
> dfkdsfjklsdfjlsdfjksldflkewnklwer\
> sdfj;ldfkl;fd;asd;flk\
> sdfkdfl\
>
dkdsalfjkldsfjsldfdfkdsfjklsdfjlsdfjksldflkewnklwersdfj
\() 한글자만 차단
'_____' 사이에 특수문자 모두 차단 단 자신(')은 차단 못함
"     " 사이에 특수문자등 차단(단, $,$(), `` 등은 차단 못함)

multihp1:/data2/unix/unix10>a=100 200 300
ksh: 200:  not found
multihp1:/data2/unix/unix10>
multihp1:/data2/unix/unix10>a=100\ 200\ 300
multihp1:/data2/unix/unix10>echo a
a
multihp1:/data2/unix/unix10>echo $a
100 200 300
multihp1:/data2/unix/unix10>b= 100 200 300
ksh: 100:  not found
multihp1:/data2/unix/unix10>b='100 200 300'
multihp1:/data2/unix/unix10>echo $b
100 200 300
multihp1:/data2/unix/unix10>c=100 200 300
ksh: 1100:  not found
multihp1:/data2/unix/unix10>c="100 200 300"
multihp1:/data2/unix/unix10>echo $c
100 200 300
multihp1:/data2/unix/unix10>echo don't
>
>
>
>
>
> '
dont

multihp1:/data2/unix/unix10>echo "don't"
don't
multihp1:/data2/unix/unix10>echo don\'t
don't
 
multihp1:/data2/unix/unix10>a=100
multihp1:/data2/unix/unix10>b=200
multihp1:/data2/unix/unix10>echo $a $b
100 200
multihp1:/data2/unix/unix10>echo '$a $b'
$a $b
multihp1:/data2/unix/unix10>echo "$a $b"
100 200

 

▶ 내장변수와 사용자 변수
multihp1:/data2/unix/unix10>set
CCOPTS=+DAportable
COLUMNS=80
EDITOR=vi
ERASE=^H
ERRNO=10
FCEDIT=/usr/bin/ed
HOME=/data2/unix/unix10
IFS=

LANG=ko_KR.eucKR
LINENO=1
LINES=24
LOGNAME=unix10
MAIL=/var/mail/unix10
MAILCHECK=600
MANPATH=/usr/share/man/%L:/usr/share/man:/usr/contrib/man/%L:/usr/contrib/man:/usr/local/man/%L:/usr/local/man:/opt/mx/share/man:/opt/upgrade/share/man/%L:/opt/upgrade/share/man:/opt/pd/share/man/%L:/opt/pd/share/man:/opt/pd/share/man/%L:/opt/pd/share/man:/opt/pd/share/man/%L:/opt/pd/share/man:/opt/hparray/share/man/%L:/opt/hparray/share/man:/opt/graphics/common/man:/opt/openssl/man:/opt/openssl/prngd/man:/usr/dt/share/man:/opt/samba/man:/opt/gnome/man:/opt/wbem/share/man:/opt/ignite/share/man/%L:/opt/ignite/share/man:/opt/aCC/share/man/%L:/opt/aCC/share/man:/opt/audio/share/man:/opt/ansic/share/man/%L:/opt/ansic/share/man:/opt/langtools/share/man/%L:/opt/langtools/share/man:/opt/perf/man/%L:/opt/perf/man:/opt/image/share/man:/opt/imake/man:/opt/resmon/share/man/%L:/opt/resmon/share/man
NLS_LANG=American_America.KO16KSC5601
OLDPWD=/data2/unix/unix10/shell
OPTIND=1
ORACLE_BASE=/oracle
ORACLE_HOME=/oracle
ORACLE_OWNER=oracle
ORACLE_SID=ORA9
ORACLE_TERM=vt100
ORA_NLS33=/oracle/ocommon/nls/admin/data
PATH=/usr/bin:usr/sbin:.
PPID=18860
PS1=multihp1:$PWD>
PS2=>
PS3=#?
PS4=+
PWD=/data2/unix/unix10
RANDOM=32043
SECONDS=7144
SHELL=/usr/bin/ksh
SHLIB_PATH=/oracle/lib:/usr/lib:/usr/dt/lib
TERM=xterm
TMOUT=0
TNS_ADMIN=/oracle/network/admin
TZ=KST-9
_=/usr/bin/ksh               _____________________ 여기를 기준으로 위에는 내장변수이고 아래는 사용자변수이다.
a=100
b=200
c=100 200 300

 

▶export는 환경변수로 셋팅해주는 것이다.
multihp1:/data2/unix/unix10>export b=200
multihp1:/data2/unix/unix10>echo $b
200
multihp1:/data2/unix/unix10>ksh
multihp1:/data2/unix/unix10>echo $b
200
multihp1:/data2/unix/unix10>ksh
multihp1:/data2/unix/unix10>echo $b
200


env      --> 환경변수 보기
export   --> 환경변수 보기
set      --> 환경변수, 지역변수 모두 보기

 

▶ 쉘 환경변수
$HOME      -> 사용자의 홈 디렉토리
$MAIL      -> 사용자에게 오는 mail이 쌓이는 파일명
$PATH      -> 임의의 명령어를 실행시킬 때 검색되는 디렉토리의 순서
$CDPATH    -> cd 명령을 실행할 때
$PS1       -> 첫 번째 프롬프트의 문자열
$PS2       -> 두 번째 프롬프트의 문자열
$IFS       -> 쉘의 내부 필드 분리자로 사용되는 문자 (default : 공백)

PS1=multihp1:$PWD>
PS2=>      ---> Secondary Prompt
PS3=#?
PS4=+    ----> Debugging Prompt

 

▶ Debugging을 할 때 사용할 수 있음
multihp1:/data2/unix/unix10>ksh -v b.sh
date
2011년11월24일 (목), 오전 11시42분26초
echo suho hi~~~
suho hi~~~

multihp1:/data2/unix/unix10>^C
multihp1:/data2/unix/unix10>ksh -x b.sh
+ date
2011년11월24일 (목), 오전 11시43분17초
+ echo suho hi~~~
suho hi~~~
PS1=$PWD>     ---> 출력의 재지정 꺽쇠로 인식
PS1='$PWD>'   ---> OK
PS1="$PWD>"   ---> 여기서 $와 >를 cutting
PS1=\$PWD\>   ---> OK

 

▶ 변수 선언하고 선언한 변수 보기 여기서 $10의 경우는  $1과 0을 인식한 것이다. 그래서 ${}를 사용
multihp1:/data2/unix/unix10>set a b c d e f g h i j
multihp1:/data2/unix/unix10>echo $1
a
multihp1:/data2/unix/unix10>echo $2
b
multihp1:/data2/unix/unix10>echo $9
i
multihp1:/data2/unix/unix10>echo $10
a0
multihp1:/data2/unix/unix10>echo ${10}
j


multihp1:/data2/unix/unix10>echo $*
a b c d e f g h i j
multihp1:/data2/unix/unix10>echo $#
10
multihp1:/data2/unix/unix10>echo$0
ksh: echo-ksh:  not found
multihp1:/data2/unix/unix10>echo $0
-ksh

multihp1:/data2/unix/unix10>echo $$
24562
multihp1:/data2/unix/unix10>ps
   PID TTY       TIME COMMAND
 24876 pts/tY    0:00 ps
 24561 pts/tY    0:00 telnetd
 24562 pts/tY    0:00 ksh

 multihp1:/data2/unix/unix10>ksh
multihp1:/data2/unix/unix10>ps
   PID TTY       TIME COMMAND
 24561 pts/tY    0:00 telnetd
 24562 pts/tY    0:00 ksh
 24907 pts/tY    0:00 ksh
 24910 pts/tY    0:00 ps
multihp1:/data2/unix/unix10>echo $$
24907
multihp1:/data2/unix/unix10>echo $$
24907
multihp1:/data2/unix/unix10>ksh
multihp1:/data2/unix/unix10>echo $$
24938
multihp1:/data2/unix/unix10>ksh
multihp1:/data2/unix/unix10>echo $$
24942
multihp1:/data2/unix/unix10>ps -f
     UID   PID  PPID  C    STIME TTY       TIME COMMAND
  unix10 24946 24942  0 12:07:19 pts/tY    0:00 ps -f
    root 24561   793  0 11:55:11 pts/tY    0:00 telnetd -b /etc/telnet_banner
  unix10 24938 24907  0 12:07:01 pts/tY    0:00 ksh
  unix10 24942 24938  0 12:07:12 pts/tY    0:00 ksh
  unix10 24562 24561  0 11:55:11 pts/tY    0:00 -ksh
  unix10 24907 24562  0 12:06:29 pts/tY    0:00 ksh
 
 
multihp1:/data2/unix/unix10>sleep 1000&
[1]     25134
multihp1:/data2/unix/unix10>echo $!
25134

▶ 참과 거짓에 대한 값을 반환 0(참), 0이외(거짓)
multihp1:/data2/unix/unix10>ls
2342         core         ff1          labdir2      my.sh        unix.out
DSFSD        cp.out       ff2          labdir4      nohup.out    who.out
a            err.out      find.out     labdir5      public
aa           f3           grep.out     letter       shell
aaa          f4           labdir       ls.out       sort.out
b.sh         f5           labdir.cpio  mbox         suho.tar.gz
multihp1:/data2/unix/unix10>echo $?
0
multihp1:/data2/unix/unix10>echo $3
ksh: 3: parameter not set
multihp1:/data2/unix/unix10>echo $?
1

이 글은 스프링노트에서 작성되었습니다.

'04번. IT 힌트얻기 > ▶ UNIX' 카테고리의 다른 글

Unix-basic-10(shell)  (0) 2011.11.24
Unix-basic-06  (1) 2011.11.24
Unix-basic-08  (0) 2011.11.24
Unix-basic-05  (0) 2011.11.23
Unix-Basic-04  (0) 2011.11.22