링크 ux 에서 입 출력 방향 변경

14337 단어 linuxshell
inux 리 셋 이란 원래 의 기본 적 인 것 을 수정 하고 원래 시스템 명령 의 기본 실행 방식 을 바 꾸 는 것 을 말한다. 예 를 들 어 간단 한 것 은 모니터 의 출력 을 보고 싶 지 않 고 특정한 파일 에 출력 하고 싶 으 면 Linux 리 셋 을 통 해 이 작업 을 할 수 있다.
리 눅 스 의 기본 입력 은 키보드 이 고 출력 은 모니터 입 니 다.너 는 이 설정 들 을 재정 비 로 바 꿀 수 있다.예 를 들 어 wc 명령 을 사용 할 때 문자 수 를 수 동 으로 입력 해 야 하 는데 방향 을 바 꾼 후에 이미 쓴 파일 을 '<' 로 이 명령 을 가리 키 면 이 파일 의 문자 수 등 을 직접 통계 할 수 있 습 니 다.출력 도 마찬가지 입 니 다. 화면 출력 을 파일 로 바 꾸 고 파일 로 결 과 를 볼 수 있 습 니 다.리 셋 조작 자 는 명령 입력 과 출력 데이터 흐름 을 기본 위치 에서 다른 위치 로 리 셋 할 수 있 으 며, 입력 이나 출력 데이터 흐름 의 위 치 를 핸들 이 라 고 부른다.흔히 볼 수 있 는 문형 은 세 가지 가 있 는데 물론 문형 은 스스로 확장 할 수 있 고 일반적인 OS 는 모두 비슷 한 기능 을 제공한다.핸들
stdIN 0 키보드 입력
알림 창 에 stdOUT 1 출력 정보
stdERR 2 알림 창 에 오류 정 보 를 출력 합 니 다.
기본 < 리 셋 입력 조작 자 는 0 이 고, 기본 > 리 셋 출력 조작 자 는 1 입 니 다.< 또는 > 조작 자 를 입력 한 후 데이터 의 읽 기와 쓰기 위 치 를 지정 해 야 합 니 다. 파일 이름 이나 다른 기 존 구문 일 수 있 습 니 다.
기 존 핸들 로 재 설정 하려 면 & 문 자 를 사용 하 십시오. 뒤쪽 으로 재 설정 할 핸들 번호 (즉 & 핸들 번호) 를 연결 하 십시오.
예 를 들 어 다음 명령 은 핸들 2 (즉 stdERR) 를 핸들 1 (즉 stdOUT): 2 > & 1 로 바 꿀 수 있 습 니 다.
다음 표 는 입력 과 출력 데이터 흐름 을 바 꿀 수 있 는 조작 자 를 보 여 줍 니 다.
리 눅 스 리 셋 연산 자 기능 설명
> 명령 프롬프트 나 핸들 대신 명령 출력 을 파일 이나 장치 에 기록 합 니 다.
< 키보드 나 핸들 대신 파일 에서 명령 입력
>> 파일 에 있 는 정 보 를 삭제 하지 않 고 명령 출력 을 파일 끝 에 추가 합 니 다.
> & 한 핸들 의 출력 을 다른 핸들 의 입력 에 기록 합 니 다.
< & 한 핸들 에서 입력 을 읽 고 다른 핸들 출력 에 기록 합 니 다.
| 한 명령 에서 출력 을 읽 고 다른 명령 의 입력 에 기록 합 니 다.파이프 조작 부호 라 고도 부른다
이제 우 리 는 고 개 를 돌려 위의 그 문 구 를 보 았 다. my sh > my log. txt 2 > & 1 을 보면 알 수 있다.
> my log. txt 는 표준 출력 을 my log. txt 로 바 꾸 고 my sh 1 > my log. txt 와 같은 값 으로 바 꾸 는 것 을 의미 합 니 다.
2 > & 1 은 오류 출력 을 핸들 1 표준 출력 으로 재 설정 한 다 는 뜻 입 니 다.종합해 보면 my sh 명령 을 실행 하 는 과정 에서 발생 하 는 표준 출력 과 오류 출력 은 모두 my log. txt 로 재 설정 된다.
방향 을 바 꾸 는 기능 이 매우 강하 고 관심 이 있 는 사람 은 다양한 조합 을 시도 해 볼 수 있 습 니 다. 앞 뒤 위치 가 바 뀌 면 어떤 결과 가 나 올 지 볼 수 있 습 니 다.
어떤 때 는 표준 출력 이나 오류 출력 을 기록 하고 싶 지 않 을 수도 있 습 니 다. my sh > null 2 > null 또는 my sh >/dev/null 2 >/dev/null 을 사용 할 수 있 습 니 다.
I/O 리 셋 상세 설명
1. 기본 개념 (이것 은 뒤의 지식 을 이해 하 는 전제 이 니 반드시 이해 하 세 요)
a. I/O 재 설정 은 보통 FD 와 관련 이 있 고 셸 의 FD 는 보통 10 개, 즉 0 ~ 9 이다.
b. 상용 FD 는 3 개 로 0 (stdin, 표준 입력), 1 (stdout, 표준 출력), 2 (stderr, 표준 오류 출력) 이 고 기본 값 은 키보드, monitor, monitor 와 관련 이 있 습 니 다.
c. < 로 읽 은 데이터 채널 (stdin) 을 변경 하여 지정 한 파일 에서 읽 습 니 다.
d. > 로 보 낸 데이터 채널 (stdout, stderr) 을 변경 하여 지정 한 파일 로 출력 합 니 다.
e, 0 은 < 의 기본 값 이기 때문에 < 0 < 과 같 습 니 다.마찬가지 로 > 1 > 과 같다.
f. IO 재 설정 에서 stdout 과 stderr 의 파이프 가 먼저 준비 되 어야 stdin 에서 자 료 를 읽 을 수 있 습 니 다.
g. 파이프 "|"(pipe line): 이전 명령 의 stdout 이 다음 명령 을 받 은 stdin;
h. tee 명령 은 원래 의 I/O 에 영향 을 주지 않 는 상황 에서 stdout 을 파일 로 복사 하 는 것 입 니 다.
i. bash (ksh) 가 명령 을 수행 하 는 과정: 분석 명령 - 변수 값 구하 기 - 명령 대체 (` 와 $() - 재 설정 - 어댑터 전개 - 경로 확인 - 명령 실행;
j. () command group 을 sub - shell 에 두 고 실행 합 니 다. nested sub - shell 이 라 고도 부 릅 니 다. 아주 중요 한 특징 은 부모 셸 의 Standard input, output, and error plus any other open file descriptors 를 계승 하 는 것 입 니 다.
k, exec 명령: 현재 셸 을 대체 하고 셸 을 다시 시작 하 는 데 자주 사 용 됩 니 다. 다시 말 하면 하위 셸 을 시작 하지 않 았 습 니 다.이 명령 을 사용 하면 기 존 환경 이 삭 제 됩 니 다.exec 가 파일 설명 자 를 조작 할 때 도 이때 만 exec 는 현재 셸 환경 을 덮어 쓰 지 않 습 니 다.
2. 기본 IO
cmd > file 은 stdout 을 file 파일 로 재 설정 합 니 다.
cmd >> file 은 stdout 을 file 파일 로 재 설정 합 니 다 (추가).
cmd 1 > fiel 은 stdout 을 file 파일 로 재 설정 합 니 다.
cmd > file 2 > & 1 stdout 과 stderr 를 함께 file 파일 로 재 설정 합 니 다.
cmd 2 > file 은 stderr 를 file 파일 로 재 설정 합 니 다.
cmd 2 >> file 은 stderr 를 file 파일 로 재 설정 합 니 다 (추가).
cmd >> file 2 > & 1 stderr 와 stderr 를 함께 file 파일 로 재 설정 (추가);
cmd < file > file 2 cmd 명령 은 file 파일 을 stdin 으로 하고 file 2 파일 을 stdout 으로 합 니 다.
cat < > file 읽 기와 쓰기 로 file 열기;
cmd < file cmd 명령 은 file 파일 을 stdin 으로 합 니 다.
cmd << delimiter Here document, stdin 에서 읽 어 들 여 delimiter 분계 부 를 만 날 때 까지.
3. 진급 IO
> & n 시스템 호출 dup (2) 파일 설명자 n 을 복사 하고 결 과 를 표준 출력 으로 사용 합 니 다.
< & n 표준 입력 복사 파일 설명자 n;
< & - 표준 입력 닫 기 (키보드);
> & - 표준 출력 닫 기;
n < & - n 번 입력 을 닫 는 것 을 표시 합 니 다.
n > & - n 번 출력 을 닫 는 것 을 표시 합 니 다.
위 와 같은 모든 형식 은 하나의 숫자 를 선도 할 수 있 습 니 다. 이때 만들어 진 파일 설명 자 는 이 숫자 가 부족 한 0 이나 1 이 아 닌 이 숫자 로 지정 합 니 다.예:
2 > file 명령 을 실행 하고 오류 출력 (파일 설명자 2) 을 file 로 지정 합 니 다.
2 > & 1 명령 을 실행 하고 표준 출력 과 출력 을 합 칩 니 다.(엄 밀 히 말 하면 파일 설명자 1 을 복사 하여 파일 설명자 2 를 만 드 는 것 이지 만 효 과 는 보통 두 개의 흐름 을 합 친 것 입 니 다.)
우 리 는 2 > & 1 에 대해 상세 하 게 설명 한다. 2 > & 1 즉 FD2 = FD1 이다. 여 기 는 FD2 의 값 이 FD1 의 값 과 같다 는 것 이 아니다. 왜냐하면 > 보 낸 데이터 채널 을 바 꾸 는 것 이다. 즉, FD2 의 '데이터 출력 채널' 을 FD1 의 '데이터 출력 채널' 로 바 꾸 는 것 이다.이것 만 있 으 면 이 변 화 는 아무런 작용 이 없 는 것 같 습 니 다. 왜냐하면 FD2 의 기본 출력 과 FD1 의 기본 출력 은 원래 Monitor 이기 때 문 입 니 다!그러나 FD1 이 다른 파일, 심지어 다른 FD 일 때 이것 은 특별한 용도 가 있다.집안일 은 반드시 이 점 을 이해 해 주 십시오.
exec 0 exec 1 > outfilename\# 파일 outfilename 을 stdout 으로 엽 니 다.
exec 2 > errfilename\# 파일 errfilename 을 stderr 로 엽 니 다.
exec 0 < & -\# FD0 을 닫 습 니 다.
exec 1 > & -\# FD1 을 닫 습 니 다.
exec 5 > & -\# FD5 를 닫 습 니 다.
1    COMMAND_OUTPUT >
   2       #    stdout     .
   3       #            ,      .
   4 
   5       ls -lR > dir-tree.list
   6       #               .
   7 
   8    : > filename
   9       # >     "filename"   0  .
  10       #        ,        0     ( 'touch'     ).
  11       # :       ,        .
  12 
  13    > filename    
  14       # >     "filename"   0  .
  15       #        ,        0     ( 'touch'     ).
  16       # (    ": >"    ,      shell       .)
  17 
  18    COMMAND_OUTPUT >>
  19       #    stdout     .
  20       #        ,       ,     ,           .
  21 
  22 
  23       #        (          ):
  24       # --------------------------------------------------------------------
  25 
  26    1>filename
  27       #    stdout   "filename".
  28    1>>filename
  29       #       stdout   "filename".
  30    2>filename
  31       #    stderr   "filename".
  32    2>>filename
  33       #       stderr   "filename".
  34    &>filename
  35       #  stdout stderr       "filename".
  36 
  37       #==============================================================================
  38       #    stdout,     .
  39       LOGFILE=script.log
  40 
  41       echo "This statement is sent to the log file, \"$LOGFILE\"." 1>$LOGFILE
  42       echo "This statement is appended to \"$LOGFILE\"." 1>>$LOGFILE
  43       echo "This statement is also appended to \"$LOGFILE\"." 1>>$LOGFILE
  44       echo "This statement is echoed to stdout, and will not appear in \"$LOGFILE\"."
  45       #     ,           "reset".
  46 
  47 
  48 
  49       #    stderr,     .
  50       ERRORFILE=script.errors
  51 
  52       bad_command1 2>$ERRORFILE       #        $ERRORFILE .
  53       bad_command2 2>>$ERRORFILE      #         $ERRORFILE .
  54       bad_command3                    #      echo stderr,
  55                                       #+       $ERRORFILE .
  56       #     ,            "reset".
  57       #==============================================================================
  58 
  59 
  60 
  61    2>&1
  62       #    stderr stdout.
  63       #         stdout  ,        .
  64 
  65    i>&j
  66       #         i   j.
  67       #   i           j  .
  68 
  69    >&j
  70       #    ,         1(stdout)  j.
  71       #      stdout      j  .
  72 
  73    0< FILENAME
  74     < FILENAME
  75       #         .
  76       #  ">"     ,           .
  77       #
  78       # grep search-word <filename
  79 
  80 
  81    [j]<>filename
  82       #     "filename",    "filename"  ,          "j"  .
  83       #     "filename"   ,       .
  84       #        "j"   ,     fd 0, stdin.
  85       #
  86       #                      .
  87       echo 1234567890 > File    #      "File".
  88       exec 3<> File             #   "File"      fd 3.
  89       read -n 4 <&3             #   4   .
  90       echo -n . >&3             #       .
  91       exec 3>&-                 #   fd 3.
  92       cat File                  # ==> 1234.67890
  93       #     .
  94 
  95 
  96 
  97    |
  98       #   .
  99       #              .
 100       #  ">"   ,         .
 101       #       ,   ,                .
 102       cat *.txt | sort | uniq > result-file
 103       #     .txt         ,        ,
 104       #         "result-file" .

입 출력 을 (또는) 파이프 의 여러 인 스 턴 스 와 결합 하여 한 줄 에 쓸 수 있 습 니 다.
1 command < input-file > output-file
   2 
   3 command1 | command2 | command3 > output-file

여러 출력 흐름 을 파일 로 다시 설정 할 수 있 습 니 다.
1 ls -yz >> command.log 2>&1
   2 #       "yz"       "command.log" .
   3 #    stderr          ,
   4 #+                .
   5 
   6 #    ,                 .
   7 ls -yz 2>&1 >> command.log
   8 #          ,          .
   9 
  10 #     stdout stderr    ,
  11 #+           .

exec < filename 명령 은 stdin 을 파일 로 재 설정 합 니 다. 이 말 부터 뒤쪽 입력 은 표준 입력 이 아 닌 이 파일 에서 나 옵 니 다. (보통 키보드 입력) 줄 별로 파일 을 읽 는 방법 을 제공 하고 사용 할 수 있 습 니 다.
sed 와/또는
awk 는 모든 줄 을 분석 합 니 다.
exec 리 셋 표준 입력 사용
1 #!/bin/bash
   2 #   'exec'       .
   3 
   4 
   5 exec 6<&0          #       #6 stdin    .
   6                    #    stdin.
   7 
   8 exec < data-file   # stdin   "data-file"   .
   9 
  10 read a1            #     "data-file"    .
  11 read a2            #     "data-file"    .
  12 
  13 echo
  14 echo "Following lines read from file."
  15 echo "-------------------------------"
  16 echo $a1
  17 echo $a2
  18 
  19 echo; echo; echo
  20 
  21 exec 0<&6 6<&-
  22 #     stdin fd #6   ,        stdin    #6 ,
  23 #+     fd #6 ( 6<&- ),                  .
  24 #
  25 # <&6 6<&-          .
  26 
  27 echo -n "Enter data  "
  28 read b1  #   "read"       ,    stdin   .
  29 echo "Input read from stdin."
  30 echo "----------------------"
  31 echo "b1 = $b1"
  32 
  33 echo
  34 
  35 exit 0

exec 를 사용 하여 stdout 로 방향 을 바 꿉 니 다.
1 #!/bin/bash
   2 # reassign-stdout.sh
   3 
   4 LOGFILE=logfile.txt
   5 
   6 exec 6>&1           #  fd #6 stdout   .
   7                     #   stdout.
   8 
   9 exec > $LOGFILE     # stdout    "logfile.txt"    .
  10 
  11 # ----------------------------------------------------------- #
  12 #                   $LOGFILE.
  13 
  14 echo -n "Logfile: "
  15 date
  16 echo "-------------------------------------"
  17 echo
  18 
  19 echo "Output of \"ls -al\" command"
  20 echo
  21 ls -al
  22 echo; echo
  23 echo "Output of \"df\" command"
  24 echo
  25 df
  26 
  27 # ----------------------------------------------------------- #
  28 
  29 exec 1>&6 6>&-      #   stdout,          #6.
  30 
  31 echo
  32 echo "== stdout now restored to default == "
  33 echo
  34 ls -al
  35 echo
  36 
  37 exit 0

 exec 를 사용 하여 같은 스 크 립 트 에서 stdin 과 stdout 으로 다시 설정 합 니 다.
1 #!/bin/bash
   2 # upperconv.sh
   3 #                .
   4 
   5 E_FILE_ACCESS=70
   6 E_WRONG_ARGS=71
   7 
   8 if [ ! -r "$1" ]     #              ?
   9 then
  10   echo "Can't read from input file!"
  11   echo "Usage: $0 input-file output-file"
  12   exit $E_FILE_ACCESS
  13 fi                   #        ($1)    
  14                      #+             (   ?).
  15 
  16 if [ -z "$2" ]
  17 then
  18   echo "Need to specify output file."
  19   echo "Usage: $0 input-file output-file"
  20   exit $E_WRONG_ARGS
  21 fi
  22 
  23 
  24 exec 4<&0
  25 exec < $1            #           .
  26 
  27 exec 7>&1
  28 exec > $2            #         .
  29                      #           (    ?).
  30 
  31 # -----------------------------------------------
  32     cat - | tr a-z A-Z   #      .
  33 #   ^^^^^                #  stdin   .Reads from stdin.
  34 #           ^^^^^^^^^^   #   stdout .
  35 #   , stdin stdout      .
  36 # -----------------------------------------------
  37 
  38 exec 1>&7 7>&-       #    stout.
  39 exec 0<&4 4<&-       #    stdin.
  40 
  41 #     ,                  stdout .
  42 echo "File \"$1\" written to \"$2\" as uppercase conversion."
  43 
  44 exit 0

I/O 재 설정 은 무 서운 하위 셸 에서 변수 문 제 를 접근 할 수 없 는 방법 입 니 다.
하위 셸 피하 기
1 #!/bin/bash
   2 # avoid-subshell.sh
   3 # Matthew Walker     .
   4 
   5 Lines=0
   6 
   7 echo
   8 
   9 cat myfile.txt | while read line;  #  (   :       shell)
  10                  do {
  11                    echo $line
  12                    (( Lines++ ));  #          
  13                                    #+            .
  14                                    #   shell  .
  15                  }
  16                  done
  17 
  18 echo "Number of lines read = $Lines"     # 0
  19                                          #   !
  20 
  21 echo "------------------------"
  22 
  23 
  24 exec 3<> myfile.txt
  25 while read line <&3
  26 do {
  27   echo "$line"
  28   (( Lines++ ));                   #          
  29                                    #+             .
  30                                    #     shell,        .
  31 }
  32 done
  33 exec 3>&-
  34 
  35 echo "Number of lines read = $Lines"     # 8
  36 
  37 echo
  38 
  39 exit 0
  40 
  41 #            ,           .
  42 
  43 $ cat myfile.txt
  44 
  45 Line 1.
  46 Line 2.
  47 Line 3.
  48 Line 4.
  49 Line 5.
  50 Line 6.
  51 Line 7.
  52 Line 8.

좋은 웹페이지 즐겨찾기