산 선 에 게 셸 프로 그래 밍 배우 기 (5)

더 읽 기
이전 편 은 사용자 의 입력 을 처리 하 는 것 입 니 다. 이 산 선 은 Liux 의 표준 입력, 출력, 그리고 파일 설명자 의 사용 을 쓰 려 고 합 니 다.
Liux 시스템 은 모든 대상 을 파일 로 처리 합 니 다. 이것 은 입 출력 과정 을 포함 합 니 다. Liux 는 파일 설명자 로 모든 파일 대상 을 표시 합 니 다. 파일 설명 자 는 마이너스 정수 가 아 닌 유일한 표지 세 션 에서 열 수 있 는 파일 입 니 다. 모든 과정 에서 최대 9 개의 파일 설명자 가 있 을 수 있 습 니 다. Liux 시스템 은 기본적으로 0, 1, 2 세 개의 파일 설명자 를 사용 합 니 다.
번호
파일 설명자 기호
약어
묘사 하 다.
1
0
stdIN
표준 입력
2
1
stdOUT
표준 출력
3
2
stdERR
표준 오류
우리
[search@h1 a813]$ ll -al bbb > t2
ls:     bbb:          
[search@h1 a813]$ ll -al bbb 2> t3
[search@h1 a813]$ ll
    8
-rw-rw-r-- 1 search search  9 8   14 03:56 abc.txt
-rw-rw-r-- 1 search search  0 8   14 03:59 t2
-rw-rw-r-- 1 search search 49 8   14 03:59 t3
[search@h1 a813]$ more t3 
ls:     bbb:          
[search@h1 a813]$ 

마찬가지 로 우 리 는 정확 한 정 보 를 한 텍스트 로 바 꾸 고 잘못된 정 보 를 다른 파일 로 바 꿀 수 있 습 니 다. 그러면 분명 합 니 다. 우리 가 많은 log 에서 잘못된 정 보 를 찾 지 않 아 도 됩 니 다.
[search@h1 a813]$ ll
    12
-rw-rw-r-- 1 search search  9 8   14 03:56 abc.txt
-rw-rw-r-- 1 search search  0 8   14 04:04 error.txt
-rw-rw-r-- 1 search search 52 8   14 04:04 ok.txt
-rw-rw-r-- 1 search search  0 8   14 03:59 t2
-rw-rw-r-- 1 search search 49 8   14 03:59 t3
[search@h1 a813]$ rm -rf error.txt 
[search@h1 a813]$ rm -rf ok.txt 
[search@h1 a813]$ ls -al abc.txt  bb 2> error.txt 1> ok.txt
[search@h1 a813]$ ll
    16
-rw-rw-r-- 1 search search  9 8   14 03:56 abc.txt
-rw-rw-r-- 1 search search 48 8   14 04:06 error.txt
-rw-rw-r-- 1 search search 52 8   14 04:06 ok.txt
-rw-rw-r-- 1 search search  0 8   14 03:59 t2
-rw-rw-r-- 1 search search 49 8   14 03:59 t3
[search@h1 a813]$ more ok.txt 
-rw-rw-r-- 1 search search 9 8   14 03:56 abc.txt
[search@h1 a813]$ more error.txt 
ls:     bb:          
[search@h1 a813]$ 

방향 을 바 꾸 는 쓰기 2 >  텍스트  중간 에 빈 칸 이 있어 요.
정확 한 출력 과 오류 출력 을 파일 로 바 꿉 니 다. 명령 은 다음 과 같 습 니 다.
[search@h1 a813]$ ls -al abc.txt  cc &> test2
[search@h1 a813]$ ll
    20
-rw-rw-r-- 1 search search   9 8   14 03:56 abc.txt
-rw-rw-r-- 1 search search  48 8   14 04:06 error.txt
-rw-rw-r-- 1 search search  52 8   14 04:06 ok.txt
-rw-rw-r-- 1 search search   0 8   14 03:59 t2
-rw-rw-r-- 1 search search  49 8   14 03:59 t3
-rw-rw-r-- 1 search search 100 8   14 04:09 test2
[search@h1 a813]$ more test2 
ls:     cc:          
-rw-rw-r-- 1 search search 9 8   14 03:56 abc.txt
[search@h1 a813]$ 

임시로 방향 을 바 꾸 는 방법 을 보 여 줍 니 다.
[search@h1 a813]$ more b.sh 

#             
echo "this is a error" >&2

echo "this is a normal output"
[search@h1 a813]$ sh b.sh  2> e2.txt
this is a normal output
[search@h1 a813]$ more e2.txt 
this is a error
[search@h1 a813]$ 

임시 리 셋 은 하나의 메시지 에 만 적 용 됩 니 다. 스 크 립 트 에 대량의 데이터 가 리 셋 되 어야 한다 면 영구적 인 리 셋 을 사용 해 야 합 니 다. 다음 과 같이 보 여 줍 니 다.
[search@h1 a813]$ cat a.sh 



exec 1>out

echo "11          out  "
echo "1          out  "
echo "111          out  "
[search@h1 a813]$ sh a.sh 
[search@h1 a813]$ cat out 
11          out  
1          out  
111          out  
[search@h1 a813]$ echo "haha"
haha
[search@h1 a813]$ more out 
11          out  
1          out  
111          out  
[search@h1 a813]$ 

exec 명령 은 새 셸 을 시작 하고 stdOUT 파일 설명 자 를 파일 로 다시 지정 합 니 다.
[search@h1 a813]$ more c.sh 




exec 2>err
echo "a"
echo "aa"
echo "ab"


exec 1>pp

echo "bb"
echo "cc"  >&2


[search@h1 a813]$ sh c.sh 
a
aa
ab
[search@h1 a813]$ more pp
bb
[search@h1 a813]$ more err
cc
[search@h1 a813]$ 

스 크 립 트 에서 어떻게 입력 을 바 꾸 는 지 살 펴 보 겠 습 니 다.
[search@h1 a813]$ more testfile 
JAVA
SOLR
Lucene
Hadoop
Hive
[search@h1 a813]$ cat d.sh 



exec 0< testfile
count=1
while read line
do

echo "  :$count: $line"

count=$[ $count + 1  ]


done
[search@h1 a813]$ sh d.sh 
  :1: JAVA
  :2: SOLR
  :3: Lucene
  :4: Hadoop
  :5: Hive
[search@h1 a813]$ 

다음 에 우 리 는 자신의 파일 설명 자 를 어떻게 만 드 는 지 보 겠 습 니 다. 처음에 말 한 것 을 기억 하 십 니까? Liux 는 기본적으로 10 개의 파일 설명자 가 있 습 니 다. 그 중에서 Liux 는 앞의 3 개 (0, 1, 2) 를 사 용 했 기 때문에 우 리 는 나머지 설명 자 를 사용 할 수 있 습 니 다.
[search@h1 a813]$ cat e.sh 



exec 3> test3out

echo "    1"
echo "    21"
echo "    12"


echo "            " >&3

[search@h1 a813]$ sh e.sh 
    1
    21
    12
[search@h1 a813]$ cat test3out 
            
[search@h1 a813]$ 

물론 우리 도 exec 3 >> testout 파일 을 추가 할 수 있 습 니 다.
파일 설명자 다시 지정:
[search@h1 a813]$ cat s.sh 



exec 3>&1

exec 1>out4


echo "a"

echo "b"


exec 1>&3


echo "c"
[search@h1 a813]$ sh s.sh 
c
[search@h1 a813]$ cat out4 
a
b

위의 예 를 분석 해 보 자.
먼저 파일 설명자 3 을 1 로 재 설정 합 니 다. 즉, 표준 화면 출력 입 니 다. 그러나 두 번 째 줄 은 표준 화면 출력 을 한 파일 로 재 설정 합 니 다. 그래서 인쇄 된 a, b 는 파일 에 직접 기록 되 고 마지막 줄 은 1 표준 출력 을 3 설명자 로 재 설정 합 니 다. 3 은 표준 출력 1 로 재 설정 합 니 다.그래서 마지막 으로 화면 에 인쇄 됩 니 다.
이 리 셋 예 는 원래 설 정 된 파일 설명 자 를 복원 하 는 데 사용 할 수 있 습 니 다.
아래 를 보고 입력 방향 을 바 꿉 니 다:
[search@h1 a813]$ cat testfile 
JAVA
SOLR
Lucene
Hadoop
Hive
[search@h1 a813]$ sh g.sh 
1: JAVA
2: SOLR
3: Lucene
4: Hadoop
5: Hive
yes or no : y
you input yes
[search@h1 a813]$ sh g.sh 
1: JAVA
2: SOLR
3: Lucene
4: Hadoop
5: Hive
yes or no : n
you input no
[search@h1 a813]$ 

읽 기와 쓰기 파일 설명 자 를 만 듭 니 다:
[search@h1 a813]$ cat testfile 
JAVA
SOLR
Lucene
Hadoop
Hive
[search@h1 a813]$ sh rw.sh 
Read:  JAVA
[search@h1 a813]$ cat testfile 
JAVA
 this is a test line 
e
[search@h1 a813]$ 

파일 설명 자 를 읽 고 쓰 면 파일 포인터 가 혼 란 스 러 워 지기 때문에 사용 하 는 것 을 권장 하지 않 습 니 다.
파일 설명 자 를 닫 는 방법 을 보 겠 습 니 다.
[search@h1 a813]$ sh w.sh 
w.sh: line 9: 3:         
[search@h1 a813]$ cat o1.txt 
good hah 
[search@h1 a813]$ cat w.sh 


exec 3> o1.txt
echo "good hah " >&3


exec 3>&-

echo "bad hah" >&3
[search@h1 a813]$ 

주의해 야 할 두 번 연속 으로 파일 설명 자 를 엽 니 다. 뒤의 내용 은 원래 의 것 을 덮어 씁 니 다.
[search@h1 a813]$ sh dd.sh 
     
[search@h1 a813]$ cat o2.txt 
     
[search@h1 a813]$ cat dd.sh 


exec 3>o2.txt


echo "     " >&3

cat o2.txt


exec 3>o2.txt

echo "     " >&3




[search@h1 a813]$ 

파일 설명자 의 정 보 를 어떻게 보 는 지 보 겠 습 니 다. lsof 명령 알림 을 실행 하면 이 명령 이 없 으 면 yum install lsof 명령 을 사용 하여 먼저 설치 할 수 있 습 니 다. Debian 은 실행 할 수 있 습 니 다. apt - get install lsof 설치.
lsof 명령 의 용법 은 다음 과 같다.
lsof  filename              
lsof -a                  
lsof -c string     COMMAND                  

lsof -p                         
lsof -u username      user       
lsof -g gid     gid     
lsof +d /DIR/              
lsof +D /DIR/   ,             ,      
lsof -d FD             
lsof -n   IP   hostname,      -n  
lsof -i              
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 –> IPv4 or IPv6
protocol –> TCP or UDP
hostname –> Internet host name
hostaddr –> IPv4  
service –> /etc/service   service name (      )
port –>     (      )

열 명의 설명:
           ,                      。lsof           :

COMMAND:     
PID:     
USER:     
FD:     ,                。 cwd、txt 
TYPE:    , DIR、REG 
DEVICE:       
SIZE:     
NODE:    (         )
NAME:         

기본 실행 은 대량의 출력 을 생 성 합 니 다. 일반적으로 필터 가 필요 합 니 다. 가장 자주 사용 하 는 명령 은 - p 와 - d 입 니 다. 전 자 는 PID 를 지정 할 수 있 습 니 다. 후 자 는 표시 할 파일 설명자 의 개 수 를 허용 하고 특수 한 편집 변 수 를 사용 할 수도 있 습 니 다. shel 은 현재 pid 로 설정 합 니 다.
[root@h1 sbin]# lsof -a -p $$
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    1487 root  cwd    DIR  253,0     4096 392508 /usr/sbin
bash    1487 root  rtd    DIR  253,0     4096      2 /
bash    1487 root  txt    REG  253,0   903336     14 /bin/bash
bash    1487 root  mem    REG  253,0 99154480 394480 /usr/lib/locale/locale-archive
bash    1487 root  mem    REG  253,0    65928 261665 /lib64/libnss_files-2.12.so
bash    1487 root  mem    REG  253,0  1921216 261649 /lib64/libc-2.12.so
bash    1487 root  mem    REG  253,0    19536 261655 /lib64/libdl-2.12.so
bash    1487 root  mem    REG  253,0   135896 261691 /lib64/libtinfo.so.5.7
bash    1487 root  mem    REG  253,0   154520 261642 /lib64/ld-2.12.so
bash    1487 root  mem    REG  253,0    26060 654464 /usr/lib64/gconv/gconv-modules.cache
bash    1487 root    0u   CHR  136,0      0t0      3 /dev/pts/0
bash    1487 root    1u   CHR  136,0      0t0      3 /dev/pts/0
bash    1487 root    2u   CHR  136,0      0t0      3 /dev/pts/0
bash    1487 root  255u   CHR  136,0      0t0      3 /dev/pts/0
[root@h1 sbin]# lsof -a -p $$ 0,1,2
lsof: status error on 0,1,2: No such file or directory
lsof 4.82
 latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 usage: [-?abhlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
 [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.
[root@h1 sbin]# lsof -a -p $$ -d  0,1,2
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    1487 root    0u   CHR  136,0      0t0    3 /dev/pts/0
bash    1487 root    1u   CHR  136,0      0t0    3 /dev/pts/0
bash    1487 root    2u   CHR  136,0      0t0    3 /dev/pts/0
[root@h1 sbin]# lsof -a -p $$ -d  0,1,2,3
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    1487 root    0u   CHR  136,0      0t0    3 /dev/pts/0
bash    1487 root    1u   CHR  136,0      0t0    3 /dev/pts/0
bash    1487 root    2u   CHR  136,0      0t0    3 /dev/pts/0
[root@h1 sbin]# 

다음은 우리 가 정의 한 파일 설명 자 를 보 는 작은 테스트 를 하 겠 습 니 다.
[search@h1 a813]$ echo "a" >> o1
[search@h1 a813]$ echo "a" >> o2
[search@h1 a813]$ echo "a" >> o3
[search@h1 a813]$ cat v.sh 




exec 3> o1
exec 4> o2
exec 7< o3



lsof -a -p $$ 
[search@h1 a813]$ sh v.sh 
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
sh      1562 search  cwd    DIR  253,0     4096 274764 /home/search/a813
sh      1562 search  rtd    DIR  253,0     4096      2 /
sh      1562 search  txt    REG  253,0   903336     14 /bin/bash
sh      1562 search  mem    REG  253,0 99154480 394480 /usr/lib/locale/locale-archive
sh      1562 search  mem    REG  253,0  1921216 261649 /lib64/libc-2.12.so
sh      1562 search  mem    REG  253,0    19536 261655 /lib64/libdl-2.12.so
sh      1562 search  mem    REG  253,0   135896 261691 /lib64/libtinfo.so.5.7
sh      1562 search  mem    REG  253,0   154520 261642 /lib64/ld-2.12.so
sh      1562 search  mem    REG  253,0    26060 654464 /usr/lib64/gconv/gconv-modules.cache
sh      1562 search    0u   CHR  136,0      0t0      3 /dev/pts/0
sh      1562 search    1u   CHR  136,0      0t0      3 /dev/pts/0
sh      1562 search    2u   CHR  136,0      0t0      3 /dev/pts/0
sh      1562 search    3w   REG  253,0        0 275196 /home/search/a813/o1
sh      1562 search    4w   REG  253,0        0 275198 /home/search/a813/o2
sh      1562 search    7r   REG  253,0        2 275201 /home/search/a813/o3
sh      1562 search  255r   REG  253,0       55 275199 /home/search/a813/v.sh
[search@h1 a813]$ 

잘못된 메 시 지 를 보고 싶 지 않 으 면 빈 장치 로 다시 설정 할 수 있 습 니 다.
ls -al >/dev/null
물론 우 리 는 cat/dev/null > tesfile 을 이용 하여 파일 을 비 울 수 있 습 니 다.
mktemp test. XXXXX 는 유일한 파일 을 만 들 고 뒤의 6 개의 X 는 무 작위 로 생 성 되 어 임시 파일 을 만 들 수 있 습 니 다.
[search@h1 a813]$ mktemp t.XXXXXX
t.xhqQbm
[search@h1 a813]$ ll t.*
-rw------- 1 search search 0 8   14 05:27 t.cEjS56
-rw------- 1 search search 0 8   14 05:24 t.GLcGV0
-rw------- 1 search search 0 8   14 05:27 t.xhqQbm
[search@h1 a813]$ 


Liux 의 tmp 디 렉 터 리 에 있 는 임시 파일 은 시스템 종료 후 삭 제 됩 니 다. mktemp - t t. XXXXX 를 사용 하여 임시 파일 을 만 들 수 있 습 니 다.
[search@h1 ~]$ mktemp -t t.XXXXXX
/tmp/t.36bSRP
[search@h1 ~]$ ls -al /tmp/t.36bSRP 
-rw------- 1 search search 0 8   14 05:29 /tmp/t.36bSRP
[search@h1 ~]$ 

명령 이 생 성 되면 임시 파일 을 어디 에 두 었 는 지 상관 하지 않 고 경 로 를 되 돌려 줍 니 다.
mktemp - d dir. XXXXX 명령 은 - t 와 같이 임시 디 렉 터 리 를 만 들 고 임시 데 이 터 를 저장 할 수 있 습 니 다.
때때로 우 리 는 화면 에 표시 되 고 파일 에 기록 할 수 있 는 파일 을 사용 하고 싶 습 니 다. 이때 우 리 는 tee 명령 을 사용 할 필요 가 없습니다. tee 명령 은 T 자형 파이프 입 니 다. stdIN 이 읽 은 데 이 터 를 두 개의 땅 으로 보 낼 수 있 습 니 다. 하 나 는 STOut 이 고 하 나 는 tee 가 지정 한 파일 입 니 다.
[search@h1 ~]$ date | tee vv.txt
2014  08  14      05:36:12 CST
[search@h1 ~]$ cat vv.txt 
2014  08  14      05:36:12 CST
[search@h1 ~]$ 

기본 값 은 마지막 데 이 터 를 덮어 씁 니 다. 덮어 쓰 지 않 으 려 면 - a 명령 을 추가 할 수 있 습 니 다.
[search@h1 ~]$ date | tee vv.txt
2014  08  14      05:36:12 CST
[search@h1 ~]$ cat vv.txt 
2014  08  14      05:36:12 CST
[search@h1 ~]$ date | tee vv.txt
2014  08  14      05:37:26 CST
[search@h1 ~]$ date | tee vv.txt
2014  08  14      05:37:30 CST
[search@h1 ~]$ cat vv.txt 
2014  08  14      05:37:30 CST
[search@h1 ~]$ date | tee -a vv.txt
2014  08  14      05:37:43 CST
[search@h1 ~]$ date | tee -a vv.txt
2014  08  14      05:37:47 CST
[search@h1 ~]$ cat vv.txt 
2014  08  14      05:37:30 CST
2014  08  14      05:37:43 CST
2014  08  14      05:37:47 CST
[search@h1 ~]$ 

이 방법 을 이용 하면 로그 파일 에 데 이 터 를 저장 할 수도 있 고 화면 에 표시 할 수도 있 습 니 다.
[search@h1 ~]$ cat ddd.sh 



file=bb


echo "abc" | tee $file


echo "bbb" | tee  -a  $file


echo "ddd" | tee -a  $file




[search@h1 ~]$ sh ddd.sh 
abc
bbb
ddd
[search@h1 ~]$ cat bb 
abc
bbb
ddd
[search@h1 ~]$ 

이제 우 리 는 사용자 에 게 출력 하 는 동시에 자신 에 게 파일 을 영구적 으로 보존 할 수 있다.

좋은 웹페이지 즐겨찾기