Zsh 개발 안내 (제1 3 편 파이프 와 방향 재 설정)

8568 단어 shellzshlinux
독 서 를 지도하 다
지금까지 우 리 는 zsh 의 문법 적 특성 을 대충 알 고 기능 이 복잡 하지 않 은 스 크 립 트 를 쓸 수 있 습 니 다.그러나 셸 스 크 립 트 의 주요 응용 장면 은 문 을 닫 고 차 를 만들어 독립 된 프로그램 을 쓰 는 것 이 아니 라 외부 환경 과 상호작용 을 하 는 것 이다.그래서 실 용적 인 스 크 립 트 를 쓰 려 면 zsh 가 외부 환경 과 어떻게 상호작용 하 는 지 알 아야 합 니 다.이곳 의 외부 환경 은 다른 프로 세 스, 파일 시스템, 네트워크 등 을 포함한다.이 편 은 주로 파이프 와 방향 을 바 꾸 는데 이것 은 다른 프로 세 스, 파일 시스템 등 과 상호작용 하 는 기초 이다.
본 논문 의 명령 은 주로 파이프 의 용법 을 보 여주 기 위해 서 입 니 다. 실제 스 크 립 트 에 서 는 이 명령 을 사용 하지 않 아 도 됩 니 다. zsh 코드 로 직접 실현 할 수 있 기 때 문 입 니 다.또한 이 시 리 즈 는 관련 문서 나 책 이 매우 많 기 때문에 외부 명령 의 용법 을 상세 하 게 설명 하지 않 습 니 다.만약 에 본문의 일부 내용 을 이해 하지 못 하면 잠시 넘 어 갈 수 있 고 나머지 부분의 이해 에 영향 을 주지 않 는 다.
파이프
파 이 프 는 유 닉 스 시스템 의 비교 기초 이자 특히 중요 한 개념 으로 한 프로그램의 출력 을 다른 프로그램의 입력 으로 하고 두 프로그램의 데 이 터 를 서로 연결 할 수 있다.파 이 프 를 사용 하 는 것 만으로 도 매우 간단 하고 알 기 쉬 우 며 파이프 의 실현 세부 사항 을 알 필요 가 없다.
파이프 의 기본 사용법:
% ls
git  tmp
# wc -l             
% ls | wc -l
2

| 즉, 파 이 프 는 키보드 에 있 는 메 인 키보드 오른쪽 에 대응 하 는 상단 키 문자 입 니 다.wc - l 만 입력 하면 wc 는 사용자 의 입력 을 기다 리 고 있 습 니 다. 이 때 문자열 을 입력 한 다음 에 ctrl + d 로 입력 을 끝 낼 때 까지 다시 입력 할 수 있 습 니 다.그리고 wc 는 사용자 가 모두 몇 줄 을 입력 했 는 지 통계 한 다음 에 출력 줄 수 를 집계 합 니 다.
#   wc -l    ,    a    b    ctrl + d
% wc -l
a
b
2

그러나 앞 에 파이프 기호 가 있 으 면 ls | wc - l 은 사용자 가 입력 하 기 를 기다 리 지 않 고 ls 의 결 과 를 입력 으로 읽 은 다음 줄 수, 출력 결 과 를 통계 합 니 다.
파이프 에 대한 자세 한 정보
우 리 는 간단 한 예 를 하나 더 실행 합 니 다.
% cat | wc -l

#    cat       fd
% ls -l /proc/$(pidof cat)/fd
total 0
lrwx------ 1 goreliu goreliu 0 2017-08-30 21:15 0 -> /dev/pts/1
l-wx------ 1 goreliu goreliu 0 2017-08-30 21:15 1 -> pipe:[2803]
lrwx------ 1 goreliu goreliu 0 2017-08-30 21:15 2 -> /dev/pts/1

#    wc       fd
% ls -l /proc/$(pidof wc)/fd
total 0
lr-x------ 1 goreliu goreliu 0 2017-08-30 21:16 0 -> pipe:[2803]
lrwx------ 1 goreliu goreliu 0 2017-08-30 21:16 1 -> /dev/pts/1
lrwx------ 1 goreliu goreliu 0 2017-08-30 21:16 2 -> /dev/pts/1

cat 명령 의 효 과 는 사용자 가 입력 할 때 까지 기다 리 는 것 입 니 다. 사용자 가 ctrl - d 를 누 를 때 까지 이 줄 을 다시 지 는 것 입 니 다.그래서 cat | wc - l 도 사용자 의 입력 을 기다 릴 것 입 니 다.
fd 가 가리 키 는 방향 을 보 겠 습 니 다./dev/ps1/1 은 가짜 터미널 장치 파일 을 가리 키 는 것 입 니 다. 프로 세 스 는 이 를 통 해 사용자 의 입력 과 출력 내용 을 읽 습 니 다.0 은 표준 입력 (즉 사용자 입력 단) 이 고, 1 은 표준 출력 (즉 정상 적 인 상황 의 출력 단) 이 며, 2 는 오류 출력 (즉 이상 한 상황 의 출력 단) 이다.그러나 cat 의 출력 단 은 하나의 파 이 프 를 가리 키 고 wc 의 입력 단 은 같은 파 이 프 를 가리 키 는데 이것 은 두 프로 세 스 의 입 출력 단 이 파 이 프 를 통 해 연 결 된 것 을 의미한다.이 파 이 프 는 익명 의 파이프 로 커 널 에 만 존재 하 며 해당 하 는 파일 경로 가 없습니다.
방향 을 바꾸다
방향 을 바 꾸 는 것 은 fd 의 방향 을 바 꾸 는 것 을 말 하 며, 파이프 도 방향 을 바 꾸 는 방법 이다.그러나 더 많은 것 은 프로 세 스 의 fd 를 파일 로 바 꾸 는 것 입 니 다.
가장 간단 한 예 는 파일 에 내용 을 출력 하 는 것 이다.
% echo abce > test.txt
% cat test.txt
abce

이 용법 은 너무 흔 하기 때문에 모두 가 습관 이 되 었 을 것 이다.우 리 는 여전히 더 많은 세부 사항 을 살 펴 보 았 다.
% cat > test.txt

#      zsh    
% ls -l /proc/$(pidof cat)/fd
total 0
lrwx------ 1 goreliu goreliu 0 Aug 30 21:43 0 -> /dev/pts/1
l-wx------ 1 goreliu goreliu 0 Aug 30 21:43 1 -> /tmp/test.txt
lrwx------ 1 goreliu goreliu 0 Aug 30 21:43 2 -> /dev/pts/1

표준 출력 이 test. txt 파일 을 가리 키 는 것 을 볼 수 있 습 니 다.
표준 출력 을 제외 하고 표준 입력 (fd 0), 오류 출력 (fd 2) 도 가능 합 니 다.
% touch 0.txt 1.txt 2.txt
% sleep 1000 <0.txt >1.txt 2>2.txt

#      zsh    
% ls -l /proc/$(pidof sleep)/fd
total 0
lr-x------ 1 goreliu goreliu 0 Aug 30 21:46 0 -> /tmp/0.txt
l-wx------ 1 goreliu goreliu 0 Aug 30 21:46 1 -> /tmp/1.txt
l-wx------ 1 goreliu goreliu 0 Aug 30 21:46 2 -> /tmp/2.txt

< 0. txt 는 리 셋 표준 입력, 2 > 2. txt 는 리 셋 오류 출력, > 1. txt (즉 1 > 1. txt) 는 표준 출력 으로 리 셋 합 니 다.그런 후에 우 리 는 세 개의 서류 가 이미 각자 제자리 에 있 는 것 을 보고 모두 방향 을 바 꾸 었 다.그러나 sleep 는 아무것도 읽 고 쓰 지 않 기 때문에 입 출력 으로 방향 을 바 꾸 는 것 은 의미 가 없습니다.
더 많은 방향 을 바 꾸 는 용법
하나의 fd 는 하나의 파일 로 만 재 설정 할 수 있 고 일일이 대응 할 수 있 습 니 다.그러나 zsh 에서 우 리 는 하나의 fd 를 여러 파일 에 대응 할 수 있다.
% cat >0.txt >1.txt >2.txt

입력 이 끝 난 후 세 파일 의 내용 이 모두 업데이트 되 었 습 니 다. 어떻게 된 일 입 니까?
사실은 zsh 프로 세 스 가 중 개 를 했 습 니 다.
% pstree -p | grep cat
        `-tmux: server(1172)-+-zsh(1173)---cat(1307)---zsh(1308)

% ls -l /proc/1307/fd
total 0
lrwx------ 1 goreliu goreliu 0 Aug 30 21:57 0 -> /dev/pts/1
l-wx------ 1 goreliu goreliu 0 Aug 30 21:57 1 -> pipe:[2975]
lrwx------ 1 goreliu goreliu 0 Aug 30 21:57 2 -> /dev/pts/1

% ls -l /proc/1308/fd
total 0
l-wx------ 1 goreliu goreliu 0 Aug 30 21:58 12 -> /tmp/0.txt
l-wx------ 1 goreliu goreliu 0 Aug 30 21:58 13 -> /tmp/1.txt
lr-x------ 1 goreliu goreliu 0 Aug 30 21:58 14 -> pipe:[2975]
l-wx------ 1 goreliu goreliu 0 Aug 30 21:58 15 -> /tmp/2.txt

cat 의 표준 출력 이 파이프 로 바 뀌 었 음 을 볼 수 있 습 니 다. 파이프 맞은편 은 zsh 프로 세 스 입 니 다. 그리고 zsh 는 그 세 개의 파일 을 열 었 습 니 다.실제 내용 을 파일 에 기록 하 는 것 은 cat 가 아 닌 zsh 입 니 다.그러나 누가 썼 든 간 에 이 용법 은 매우 편리 하 다.
표준 입력, 오류 출력 도 여러 파일 로 재 설정 할 수 있 습 니 다.
% echo good >0.txt >1.txt >2.txt

% cat <0.txt <1.txt <2.txt
good
good
good

cat 의 표준 출력 을 3 개의 파일 로 재 설정 합 니 다. 3 개의 파일 내용 을 모두 읽 었 습 니 다.
fd 를 여러 파일 로 동시에 바 꿀 수 있 는 것 외 에 파이프 와 파일 로 동시에 바 꿀 수 있 습 니 다.
#    a b c   ctrl -d   
% cat >0.txt >1.txt | wc -l
a
b
c
3

% cat 0.txt 1.txt
a
b
c
a
b
c

입력 한 내용 이 파일 에 기록 되 어 있 고 파 이 프 를 통 해 wc - l 에 전 달 된 것 을 볼 수 있 습 니 다. 이것 은 말 할 것 도 없 이 zsh 가 배후 작업 을 하고 데 이 터 를 파일 과 파이프 에 나 누 어 주 었 습 니 다.그래서 zsh 에 서 는 tee 명령 을 사용 할 필요 가 없습니다.
명명 파이프
익명 의 파 이 프 를 제외 하고 우 리 는 이름 의 파 이 프 를 사용 할 수 있어 서 더욱 쉽게 제어 할 수 있다.파이프 이름 에 사용 할 파일 은 FIFO (First Input First Output, 선 입 선 출) 파일 입 니 다.
# mkfifo      FIFO   
% mkfifo fifo
% ls -l
prw-r--r-- 1 goreliu goreliu 0 2017-08-30 21:29 fifo|

# cat    fifo
% cat > fifo

#       zsh,   wc -l    fifo
% wc -l < fifo

그리고 cat 쪽 에 내용 을 입력 하고 ctrl - d 를 누 르 면 wc 쪽 에서 입력 한 줄 수 를 집계 합 니 다.
입력 이 완료 되 기 전에 cat 와 wc 두 프로 세 스 의 fd 가 어디 를 가리 키 는 지 볼 수 있 습 니 다.
% ls -l /proc/$(pidof cat)/fd
total 0
lrwx------ 1 goreliu goreliu 0 Aug 30 21:35 0 -> /dev/pts/2
l-wx------ 1 goreliu goreliu 0 Aug 30 21:35 1 -> /tmp/fifo
lrwx------ 1 goreliu goreliu 0 Aug 30 21:35 2 -> /dev/pts/2

% ls -l /proc/$(pidof wc)/fd
total 0
lr-x------ 1 goreliu goreliu 0 Aug 30 21:34 0 -> /tmp/fifo
lrwx------ 1 goreliu goreliu 0 Aug 30 21:34 1 -> /dev/pts/1
lrwx------ 1 goreliu goreliu 0 Aug 30 21:34 2 -> /dev/pts/1

이전 익명 파이프 가 우리 가 방금 만 든 fifo 파일 로 바 뀌 었 음 을 볼 수 있 습 니 다. 다른 것 은 다 르 지 않 습 니 다.
exec 명령 의 용법
방향 을 바 꾸 자 면 exec 명령 을 내 릴 수 밖 에 없다.exec 명령 은 현재 프로 세 스 를 바 꾸 고 fd 를 바 꾸 는 데 사 용 됩 니 다.
exec 로 새 프로 세 스 시작 하기:
% exec cat

보아하니 효과 와 cat 를 직접 실행 하 는 것 은 차이 가 많 지 않다.그러나 ctrl + d 를 실행 하여 cat 를 종료 하면 터미널 시 뮬 레이 터 가 닫 힙 니 다. exec cat 를 실행 할 때 zsh 프로 세 스 는 cat 로 대체 되 어 돌아 갈 수 없 기 때 문 입 니 다.
그러나 스 크 립 트 에 서 는 exec 를 직접 사용 하지 않 습 니 다. fd 를 사용 하 는 경우 가 많 습 니 다.
#     zsh           test.txt
% exec 2>test.txt
#             ,        
% fdsafds
#           test.txt  
% cat test.txt
zsh: command not found: fdsafds

더 많은 사용법:
사용법
기능.
n>filename
fd n 의 출력 을 filename 파일 로 다시 지정 합 니 다.
n
fd n 의 입력 을 filename 파일 로 재 설정 합 니 다.
n<>filename
fd n 의 입 출력 을 filename 파일 로 변경 합 니 다.
n>&m
fd n 의 출력 을 fd m 로 다시 지정 합 니 다.
n
fd n 의 입력 을 fd m 로 재 설정 합 니 다.
n>&-
fd n 출력 닫 기
n
fd n 입력 닫 기
더 많은 예:
#        ,           
% exec 2>&-
% fsdafdsa

% exec 3>test.txt
% echo good >&3
% exec 3>&-
#         
% echo good >&3
zsh: 3: bad file descriptor

% exec 3>test.txt
#   fd 4         fd 3
% exec 4>&3
% echo abcd >&4
#       fd 4,test.txt      
% cat test.txt
abcd

일반적으로 우 리 는 exec 를 사용 하여 출력 을 재 설정 하고 닫 기 위해 입력 을 적 게 작 동 합 니 다.
총결산
본 고 는 파이프 와 방향 을 바 꾸 는 기본 개념 과 각종 용법 을 이야기 하 였 다.Zsh 의 방향 을 바 꾸 는 것 은 매우 유연 하고 사용 하기 좋 으 며, 이후 의 글 은 실제 장면 에서 어떻게 사용 하 는 지 상세 하 게 설명 할 것 이다.
레 퍼 런 스
http://adelphos.blog.51cto.co...
역 사 를 갱신 하 다
20170901: "exec 명령 의 용법"을 추가 합 니 다.
본 고 는 더 이상 업데이트 되 지 않 습 니 다. 전체 시 리 즈 는 여기 서 유지 보 수 를 업데이트 합 니 다. github.com/goreliu/zshguide
유 료 로 Windows, Linux, Shell, C, C++, AHK, Python, JavaScript, Lua 등 분야 관련 문 제 를 해결 하고 유연 하 게 가격 을 책 정 합 니 다. 상담 을 환영 합 니 다. 위 챗 ly 50247.

좋은 웹페이지 즐겨찾기