산 선 에 게 셸 프로 그래 밍 배우 기 (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 ~]$
이제 우 리 는 사용자 에 게 출력 하 는 동시에 자신 에 게 파일 을 영구적 으로 보존 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.