Linux 입력 리디렉션. 표준 오류 출력. 자신만의 출력 리디렉션 만들기

Linux에 내장된 리디렉션 기능은 모든 종류의 작업을 위한 광범위하고 단순화된 도구를 제공합니다. 다양한 I/O 스트림을 관리하는 기능은 복잡한 소프트웨어를 개발할 때나 명령줄을 사용하여 파일을 관리할 때 모두 생산성을 크게 향상시킵니다.

I/O 스레드

Linux 환경의 입력 및 출력은 다음 세 가지 스레드에 분산됩니다.

  • 표준 입력(표준 입력, stdin, 스레드 번호 0)
  • 표준 출력(stdout, 번호 1)
  • 표준 오류 또는 진단 스트림(표준 오류, stderr, 숫자 2)

사용자가 터미널과 상호 작용할 때 표준 입력은 사용자의 키보드를 통해 전송됩니다. 표준 출력과 표준 오류는 사용자 터미널에 텍스트로 표시됩니다. 이 세 가지 스트림을 모두 표준 스트림이라고 합니다.

표준 입력

표준 입력 스트림은 일반적으로 사용자로부터 프로그램으로 데이터를 전달합니다. 표준 입력이 필요한 프로그램은 일반적으로 장치(예: 키보드)에서 입력을 받습니다. 표준 입력은 EOF(파일 끝)에 도달하면 중지됩니다. EOF는 더 이상 읽을 데이터가 없음을 나타냅니다.

표준 입력이 어떻게 작동하는지 보려면 cat 프로그램을 실행하십시오. 이 도구의 이름은 "연결하다"(무언가를 연결하거나 결합하다)를 의미합니다. 일반적으로 이 도구는 두 파일의 내용을 결합하는 데 사용됩니다. 인수 없이 실행하면 cat은 명령 프롬프트를 열고 표준 입력의 내용을 받아들입니다.

이제 숫자를 입력하세요.

1
2
3
Ctrl-D

숫자를 입력하고 Enter 키를 누르면 데이터를 받아들이는 실행 중인 cat 프로그램에 표준 입력을 보냅니다. 그러면 cat 프로그램은 수신된 입력을 표준 출력에 표시합니다.

사용자는 ctrl-d를 눌러 EOF를 설정할 수 있으며, 그러면 cat 프로그램이 중지됩니다.

표준 출력

표준 출력은 프로그램에서 생성된 데이터를 기록합니다. 표준 출력이 리디렉션되지 않은 경우 터미널에 텍스트가 출력됩니다. 예시로 다음 명령을 실행해 보세요.

echo 표준 출력을 통해 터미널로 전송됩니다.

추가 옵션 없이 echo 명령은 명령줄에서 전달된 모든 인수를 화면에 표시합니다.

이제 인수 없이 echo를 실행합니다.

이 명령은 빈 문자열을 반환합니다.

표준 에러

이 표준 스트림은 충돌한 프로그램에 의해 생성된 오류를 기록합니다. 표준 출력과 마찬가지로 이 스트림은 데이터를 터미널로 보냅니다.

ls 명령 오류 스트림의 예를 살펴보겠습니다. ls 명령은 디렉터리의 내용을 표시합니다.

인수가 없으면 이 명령은 현재 디렉터리의 내용을 반환합니다. ls에 인수로 디렉터리 이름을 제공하면 명령이 해당 내용을 반환합니다.

% 디렉토리가 존재하지 않으므로 명령은 표준 오류를 반환합니다.

ls: %에 접근할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

스트림 리디렉션

Linux는 각 스레드를 리디렉션하는 특수 명령을 제공합니다. 이 명령은 표준 출력을 파일에 기록합니다. 출력이 존재하지 않는 파일로 리디렉션되면 명령은 해당 이름을 가진 새 파일을 만들고 리디렉션된 출력을 해당 파일에 저장합니다.

꺾쇠 괄호가 하나 있는 명령은 대상 파일의 기존 내용을 덮어씁니다.

  • > - 표준 출력
  • < — стандартный ввод
  • 2> - 표준 오류

이중 꺾쇠 괄호가 있는 명령은 대상 파일의 내용을 덮어쓰지 않습니다.

  • >> - 표준 출력
  • << — стандартный ввод
  • 2>> - 표준 오류

다음 예를 고려하십시오.

고양이 > write_to_me.txt



Ctrl-D

이 예에서는 cat 명령을 사용하여 출력을 파일에 기록합니다.

write_to_me.txt의 내용을 검토하십시오.

고양이 write_to_me.txt

명령은 다음을 반환해야 합니다.

cat을 write_to_me.txt로 다시 리디렉션하고 세 개의 숫자를 입력하세요.

고양이 > write_to_me.txt
1
2
3
Ctrl-D

이제 파일 내용을 확인해 보세요.

고양이 write_to_me.txt

명령은 다음을 반환해야 합니다.

보시다시피 출력을 리디렉션하는 명령이 단일 꺾쇠 괄호를 사용했기 때문에 파일에는 최신 출력만 포함됩니다.

이제 두 개의 꺾쇠괄호를 사용하여 동일한 명령을 실행해 보세요.

고양이 >> write_to_me.txt



Ctrl-D

write_to_me.txt를 엽니다.

1
2
3


이중 꺾쇠 괄호가 있는 명령은 기존 내용을 덮어쓰지 않고 내용에 추가합니다.

컨베이어

파이프는 한 명령의 출력을 다른 명령의 입력으로 리디렉션합니다. 이 경우 두 번째 프로그램으로 전송된 데이터는 단말기에 표시되지 않습니다. 데이터는 두 번째 프로그램에서 처리한 후에만 화면에 나타납니다.

Linux의 파이프라인은 수직 막대로 표시됩니다.

예를 들어:

이 명령은 ls의 출력(현재 디렉터리의 내용)을 less로 전달하여 전달된 데이터를 한 줄씩 표시합니다. 일반적으로 ls는 디렉토리의 내용을 줄로 나누지 않고 연속적으로 표시합니다. ls 출력을 less로 리디렉션하면 후자의 명령이 출력을 여러 줄로 분할합니다.

보시다시피 파이프라인은 데이터를 파일로만 리디렉션하는 > 및 >>와 달리 한 명령의 출력을 다른 명령의 입력으로 리디렉션할 수 있습니다.

필터

필터는 파이프라인의 리디렉션과 출력을 변경할 수 있는 명령입니다.

메모: 필터는 파이프라인 없이 사용할 수 있는 표준 Linux 명령이기도 합니다.

  • find - 이름으로 파일을 검색합니다.
  • grep – 주어진 패턴을 사용하여 텍스트를 검색합니다.
  • tee – 표준 입력을 표준 출력 및 하나 이상의 파일로 리디렉션합니다.
  • tr – 문자열을 검색하고 바꿉니다.
  • wc - 문자, 줄, 단어를 계산합니다.

I/O 리디렉션의 예

이제 리디렉션의 기본 개념과 메커니즘에 익숙해졌으므로 이를 사용하는 몇 가지 기본 예를 살펴보겠습니다.

명령> 파일

이 패턴은 명령의 표준 출력을 파일로 리디렉션합니다.

ls ~> root_dir_contents.txt

이 명령은 시스템 루트 디렉터리의 내용을 표준 출력으로 전달하고 출력을 root_dir_contents 파일에 씁니다. 명령은 단일 꺾쇠 괄호를 사용하므로 파일의 이전 내용이 모두 삭제됩니다.

명령 > /dev/null

/dev/null은 원치 않는 콘솔 출력을 피하기 위해 표준 출력이나 진단을 억제하는 데 사용되는 특수 파일("널 장치"라고 함)입니다. /dev/null로 끝나는 모든 데이터는 삭제됩니다. /dev/null로의 리디렉션은 일반적으로 쉘 스크립트에서 사용됩니다.

ls > /dev/null

이 명령은 ls가 반환한 표준 출력을 /dev/null로 재설정합니다.

명령 2 > 파일

이 패턴은 명령의 표준 오류 스트림을 파일로 리디렉션하여 현재 내용을 덮어씁니다.

mkdir "" 2> mkdir_log.txt

이 명령은 잘못된 디렉터리 이름으로 인해 발생한 오류를 리디렉션하여 log.txt에 기록합니다. 참고: 오류는 여전히 터미널에 나타납니다.

명령 >> 파일

이 패턴은 파일의 현재 내용을 덮어쓰지 않고 명령의 표준 출력을 파일로 리디렉션합니다.

echo 새 파일에 기록 > data.txt
echo 기존 파일의 내용에 추가 >> data.txt

이 명령 쌍은 먼저 사용자 입력을 새 파일로 리디렉션한 다음 내용을 덮어쓰지 않고 기존 파일에 붙여넣습니다.

명령 2>>파일

이 패턴은 파일의 기존 내용을 덮어쓰지 않고 명령의 표준 오류 스트림을 파일로 리디렉션합니다. 로그 내용이 지속적으로 업데이트되지 않으므로 프로그램 또는 서비스 오류 로그를 생성하는 데 적합합니다.

"" 2> stderr_log.txt 찾기
화장실 "" 2>> stderr_log.txt

위 명령은 잘못된 find 인수로 인해 발생한 오류 메시지를 stderr_log.txt 파일로 리디렉션한 다음 잘못된 wc 인수로 인해 발생한 오류 메시지를 stderr_log.txt 파일에 추가합니다.

팀 | 팀

이 패턴은 첫 번째 명령의 표준 출력을 두 번째 명령의 표준 입력으로 리디렉션합니다.

/var lib 찾기 | 그렙 뎁

이 명령은 /var 디렉터리와 그 하위 디렉터리에서 파일 이름과 deb 확장자를 검색하고 파일 경로를 반환하며 검색 패턴을 빨간색으로 강조 표시합니다.

팀 | 티 파일

이 패턴은 명령의 표준 출력을 파일로 리디렉션하고 해당 내용을 덮어쓴 다음 리디렉션된 출력을 터미널에 표시합니다. 지정한 파일이 없으면 새 파일을 생성합니다.

이 패턴에서 tee 명령은 일반적으로 프로그램의 출력을 보는 동시에 파일에 저장하는 데 사용됩니다.

화장실 /etc/magic | 티magic_count.txt

이 명령은 매직 파일(Linux에서는 이를 사용하여 파일 유형을 결정함)의 문자, 행 및 단어 수를 tee 명령에 전달합니다. tee 명령은 이 데이터를 터미널과 Magic_count.txt 파일로 보냅니다.

팀 | 팀 | 명령 >> 파일

이 템플릿은 첫 번째 명령의 표준 출력을 리디렉션하고 다음 두 명령을 통해 필터링한 후 최종 결과를 파일에 추가합니다.

ㅋㅋㅋ ~ | grep *tar | tr e E >> ls_log.txt

이 명령은 루트 디렉터리에 대한 ls의 출력을 grep으로 보냅니다. 그러면 grep은 수신된 데이터에서 tar 파일을 검색합니다. 그런 다음 grep의 결과는 tr 명령에 전달되어 모든 e 문자를 문자 E로 대체합니다. 결과 결과는 ls_log.txt 파일에 추가됩니다(이러한 파일이 없으면 명령은 자동으로).

결론

Linux I/O 리디렉션 기능은 처음에는 지나치게 복잡해 보입니다. 그러나 리디렉션 작업은 시스템 관리자의 가장 중요한 기술 중 하나입니다.

특정 명령에 대해 자세히 알아보려면 다음을 사용하세요.

남자 명령 | 더 적은

예를 들어:

이 명령은 tee에 대한 전체 명령 목록을 반환합니다.

태그:

1403

Unix(bash/sh)에서 "2>&1", ">/dev/null" 또는 출력 스트림 리디렉션

평가: 걸작 훌륭함 매우 좋음 좋음 보통 읽지 않음 견딜만함 보통 나쁨 매우 나쁨 읽지 않음

출력 스트림

스크립트 메시지는 잘 정의된 스트림(출력 스트림)으로 출력됩니다. 그래서 우리가 출력한 것은

에코 "안녕하세요, 세상!"

단순히 화면에 표시되는 것이 아니라 시스템, 특히 명령 해석기 sh 및 bash의 관점에서 보면 특정 출력 스트림을 통해 출력됩니다. 에코의 경우 화면과 연결된 스트림 번호 1(stdout)입니다.

일부 프로그램과 스크립트는 다른 출력 스트림(2번(stderr))을 사용하기도 합니다. 거기에 오류 메시지가 표시됩니다. 이를 통해 일반 정보와 오류 메시지를 스트림에서 분리하고 별도로 라우팅하고 처리할 수 있습니다.

예를 들어 정보 메시지의 출력을 차단하고 오류 메시지만 남길 수 있습니다. 또는 로깅을 위해 오류 메시지를 별도의 파일로 보냅니다.

">somefile"이 무엇인가요?

Unix의 이 항목(bash 및 sh 인터프리터)은 출력 스트림의 리디렉션을 나타냅니다.

다음 예에서는 ls 명령의 모든 정보(일반) 메시지를 myfile.txt 파일로 리디렉션하여 이 파일에 ls 목록만 남깁니다.

$ls > myfile.txt


이 경우 Enter 키를 누르면 화면에 아무것도 표시되지 않지만 myfile.txt 파일에는 화면에 표시되어야 하는 모든 내용이 포함됩니다.

그러나 고의로 잘못된 작업을 수행해 보겠습니다.

$ ls /masdfasdf > myfile.txt


그러면 무슨 일이 일어날까요? 왜냐하면 masdfasdf 디렉토리가 파일 시스템의 루트에 존재하지 않으면(그렇다고 가정합니다. 그렇다면 어떻게 될까요?) ls 명령은 오류를 생성합니다. 그러나 이 오류는 일반 stdout 스트림(1)이 아니라 오류 스트림 stderr(2)을 통해 발생합니다. 그리고 리디렉션은 stdout("> myfile.txt")에 대해서만 설정됩니다.

왜냐하면 stderr(2) 스트림을 다른 곳으로 리디렉션하지 않았습니다. 오류 메시지는 화면에 표시되고 myfile.txt 파일에는 표시되지 않습니다.

이제 정보 데이터가 myfile.txt 파일에 기록되고 오류 메시지가 myfile.err 파일에 기록되도록 ls 명령을 실행해 보겠습니다. 실행 중에 화면에는 아무 것도 나타나지 않습니다.

$ ls >myfile.txt 2>myfile.err


여기서 우리는 처음으로 리디렉션으로 스트림 번호를 표시하는 것을 접하게 됩니다. "2>myfile.err" 항목은 스트림 번호 2(stderr)가 myfile.err 파일로 리디렉션되어야 함을 나타냅니다.

물론 두 스트림을 모두 동일한 파일이나 동일한 장치로 보낼 수 있습니다.

2>&1

스크립트에서 이러한 항목을 자주 찾을 수 있습니다. 이는 "스트림 번호 2를 스트림 번호 1로 리디렉션" 또는 "스트림 stderr - 스트림 stdout을 통해 리디렉션"을 의미합니다. 저것들. 우리는 오류가 아닌 정상적인 메시지가 일반적으로 인쇄되는 스레드를 통해 모든 오류 메시지를 라우팅합니다.

$ ls /asfasdf 2>&1


다음은 모든 메시지가 myfile.txt 파일로 리디렉션되는 또 다른 예입니다.

$ ls /asfasdf >myfile.txt 2>&1


이 경우 오류 메시지와 정상 메시지 모두 myfile.txt에 기록됩니다. 먼저 stdout 스트림을 파일로 리디렉션한 다음 오류를 stdout에 덤프해야 함을 표시했습니다. 그에 따라 myfile.txt 파일에

/dev/null

그러나 때로는 모든 메시지를 저장하지 않고 숨겨야 하는 경우도 있습니다. 저것들. 그냥 출력을 차단하세요. 이를 위해 가상 장치 /dev/null이 사용됩니다. 다음 예에서는 ls 명령의 일반 메시지 출력을 모두 /dev/null로 지정합니다.

$ ls > /dev/null


화면에는 오류 메시지만 표시됩니다. 다음 예에서는 오류 메시지가 차단됩니다.

$ ls > /dev/null 2>&1


또한 이 레코드는 다음 형식의 레코드와 동일합니다.

$ ls >/dev/null 2>/dev/null


다음 예에서는 오류 메시지만 차단합니다.

$ls 2>/dev/null

여기서는 더 이상 "2>&1"을 지정할 수 없습니다. 스트림 (1)은 어디로도 리디렉션되지 않으며 이 경우 오류 메시지가 화면에 나타납니다.

계란이 먼저일까요, 아니면 닭고기가 먼저일까요?

여기서는 2가지 예를 들어보겠습니다.

예시 1)

$ ls >/dev/null 2>&1


예시 2)

$ ls 2>&1 >/dev/null


외관상 음절 위치를 재배치해도 합계는 변하지 않습니다. 그러나 리디렉션 포인터의 순서가 중요합니다!

요점은 통역사가 왼쪽에서 오른쪽으로 리디렉션을 읽고 적용한다는 것입니다. 이제 두 가지 예를 모두 살펴보겠습니다.

실시예 1

1) ">/dev/null" - 스트림 1(stdout)을 /dev/null로 보냅니다. 스트림(1)에 들어가는 모든 메시지는 /dev/null로 전송됩니다.

2) "2>&1" - 스트림 2(stderr)를 스트림 1(stdout)로 리디렉션합니다. 하지만 왜냐하면 스레드 1은 이미 /dev/null과 연결되어 있습니다. 모든 메시지는 여전히 /dev/null에서 끝납니다.

결과: 화면이 비어 있습니다.

실시예 2

1) "2>&1" - 오류 스트림 stderr(2)를 stdout 스트림(1)으로 리디렉션합니다. 동시에 왜냐하면 스레드 1은 기본적으로 터미널과 연결되어 있습니다. 화면에 오류 메시지가 성공적으로 표시됩니다.

2) ">/dev/null" - 여기서는 스레드 1을 /dev/null로 리디렉션합니다. 그리고 우리는 일반 메시지를 볼 수 없습니다.

결과: 화면에 오류 메시지가 표시되지만 일반 메시지는 표시되지 않습니다.

결론: 먼저 스트림을 리디렉션한 다음 연결하세요.

리눅스 배우기, 101

스트림, 프로그램 채널 및 리디렉션

Linux 파이프라인의 기본 학습

콘텐츠 시리즈:

짧은 리뷰

이 기사에서는 Linux에서 표준 I/O 스트림을 리디렉션하는 기본 기술을 배웁니다. 당신은 배울 것이다:

  • 표준 입력/출력 스트림(표준 입력, 표준 출력 및 표준 오류)을 리디렉션합니다.
  • 한 명령의 출력을 다른 명령의 입력으로 지정합니다.
  • 출력을 표준 출력 장치(stdout)와 파일로 동시에 보냅니다.
  • 명령의 출력을 다른 명령의 인수로 사용합니다.

이 문서는 LPI 101 Entry Level Administrator(LPIC-1) 시험을 준비하는 데 도움이 되며 주제 103의 목표 103.4의 자료를 포함합니다. 목표의 가중치는 4입니다.

이 시리즈 정보

이 기사 시리즈는 Linux 운영 체제 관리 작업을 익히는 데 도움이 됩니다. 이 기사의 자료를 사용하여 준비할 수도 있습니다.

이 시리즈의 기사에 대한 설명을 보고 해당 기사에 대한 링크를 얻으려면 당사를 참조하십시오. 이 목록은 새로운 기사가 ​​나올 때마다 지속적으로 업데이트되며 최신(2009년 4월 기준) LPIC-1 인증 시험 목표를 포함합니다. 기사가 목록에서 누락된 경우 를 참조하여 이전 LPIC-1 목표(2009년 4월 이전)를 충족하는 이전 버전을 찾을 수 있습니다.

필요한 조건

기사를 최대한 활용하려면 Linux에 대한 기본 지식이 있어야 하며, 발생하는 모든 명령을 실행할 수 있는 Linux 컴퓨터가 있어야 합니다. 때로는 프로그램 버전에 따라 결과가 다르게 나타나기 때문에 목록과 그림의 내용이 컴퓨터에서 보는 내용과 다를 수 있습니다.

예제 실행 준비

이안에게 연락하는 방법

Ian은 우리의 가장 유명하고 다작의 작가 중 한 명입니다. 개발자Works에 게시된 체크아웃(EN)을 확인하세요. 그와 다른 My developmentWorks 기여자 및 기여자에서 연락처 정보를 찾아 연락할 수 있습니다.

이 문서의 예제를 실행하기 위해 " " 문서의 앞부분에서 만든 일부 파일을 사용합니다. 이 글을 읽지 않았거나 이 파일을 저장하지 않았다면 걱정하지 마세요! 새 디렉토리 lpi103-4와 필요한 모든 파일을 만드는 것부터 시작해 보겠습니다. 이렇게 하려면 텍스트 창을 열고 홈 디렉터리로 이동하세요. 목록 1의 내용을 텍스트 상자에 복사합니다. 명령을 실행하면 lpi103-4 하위 디렉터리와 그 안에 필요한 모든 파일이 홈 디렉터리에 생성되며, 이를 예제에서 사용할 것입니다.

목록 1. 이 기사의 예제에 필요한 파일 만들기
mkdir -p lpi103-4 && cd lpi103-4 && ( echo -e "1 사과\n2 배\n3 바나나" > text1 echo -e "9\tplum\n3\tbanana\n10\tapple" > text2 echo "이것은 " !#:* !#:1->text3 분할 -l 2 text1 분할 -b 17 text2 y; )

창은 목록 2와 같아야 하며 현재 작업 디렉터리는 새로 생성된 lpi103-4 디렉터리여야 합니다.

목록 2. 필요한 파일 생성 결과
$ mkdir -p lpi103-4 && cd lpi103-4 && ( > echo -e "1 사과\n2 배\n3 바나나" > text1 > echo -e "9\tplum\n3\tbanana\n10\tapple" > text2 > echo "이것은 문장입니다." !#:* !#:1->text3echo "이것은 문장입니다." "이것은 문장입니다.">text3 > 분할 -l 2 text1 > 분할 -b 17 텍스트2 y ) $

표준 입력/출력 리디렉션

Bash와 같은 Linux 셸은 입력을 받아 시퀀스 형식으로 출력을 보냅니다. 스트림문자. 모든 문자는 이전 또는 후속 문자와 독립적입니다. 기호는 구조화된 항목이나 고정 크기 블록으로 구성되지 않습니다. 스트림은 문자 스트림이 어디에서 오거나 전송되는지(파일, 키보드, 창, 화면 또는 기타 I/O 장치)에 관계없이 I/O 메커니즘을 사용하여 액세스됩니다. Linux 셸은 세 ​​가지 표준 I/O 스트림을 사용하며 각 스트림에는 특정 파일 설명자가 할당됩니다.

  1. 표준 출력표준 출력, 명령 출력을 표시하고 핸들 1이 있습니다.
  2. 표준 오류표준 오류 스트림, 명령 오류를 표시하고 설명자 2가 있습니다.
  3. 표준 입력표준 입력, 입력을 명령에 전달하고 핸들 0을 갖습니다.

입력 스트림은 명령에 대한 입력(일반적으로 키보드)을 제공합니다. 출력 스트림은 일반적으로 터미널에 텍스트 문자를 인쇄하는 기능을 제공합니다. 터미널은 원래 ASCII 인쇄 장치 또는 디스플레이 터미널이었지만 이제는 일반적으로 컴퓨터 바탕 화면의 창일 뿐입니다.

"" 가이드를 이미 읽었다면 이 기사의 일부 내용이 익숙할 것입니다.

출력 리디렉션

출력을 파일로 리디렉션하는 방법에는 두 가지가 있습니다.

N> 파일 설명자의 출력을 리디렉션합니다. N파일로. 파일에 대한 쓰기 권한이 있어야 합니다. 파일이 존재하지 않으면 생성됩니다. 파일이 존재하는 경우 일반적으로 모든 내용이 경고 없이 삭제됩니다. N>> 또한 파일 설명자의 출력을 리디렉션합니다. N파일로. 또한 파일에 대한 쓰기 권한도 있어야 합니다. 파일이 존재하지 않으면 생성됩니다. 파일이 존재하는 경우 출력이 해당 내용에 추가됩니다.

상징 N연산자 n> 또는 n>>은 파일 설명자. 지정하지 않으면 표준 출력 장치를 사용하는 것으로 가정합니다. 목록 3에서는 이전에 lpi103-4 디렉터리에 생성된 파일을 사용하여 ls 명령의 표준 출력과 표준 오류를 분리하는 리디렉션 작업을 보여줍니다. 또한 기존 파일에 명령 출력을 추가하는 방법도 보여줍니다.

목록 3. 출력 리디렉션
$ ls x* z* ls: 액세스할 수 없음 z*: 해당 파일 또는 디렉터리 없음 xaa xab $ ls x* z* >stdout.txt 2>stderr.txt $ ls w* y* ls: 액세스할 수 없음 w*: 해당 없음 파일 또는 디렉토리 yaa yab $ ls w* y* >>stdout.txt 2>>stderr.txt $ cat stdout.txt xaa xab yaa yab $ cat stderr.txt ls: 액세스할 수 없습니다 z*: 해당 파일 또는 디렉토리가 없습니다 ls: w*에 액세스할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

n> 연산자를 사용하여 출력을 리디렉션하면 일반적으로 기존 파일을 덮어쓰게 된다는 점을 이미 언급했습니다. set 내장 명령의 noclobber 옵션을 사용하여 이 속성을 제어할 수 있습니다. 이 옵션이 정의된 경우 목록 4에 표시된 대로 n>| 연산자를 사용하여 이를 재정의할 수 있습니다.

목록 4. noclobber 옵션을 사용하여 출력 리디렉션
$ set -o noclobber $ ls x* z* >stdout.txt 2>stderr.txt -bash: stdout.txt: 기존 파일을 덮어쓸 수 없습니다 $ ls x* z* >|stdout.txt 2>|stderr.txt $ cat stdout.txt xaa xab $ cat stderr.txt ls: 액세스할 수 없습니다 z*: 해당 파일이나 디렉터리가 없습니다 $ set +o noclobber #원래 noclobber 설정 복원

때로는 표준 출력과 표준 오류를 모두 파일로 리디렉션하고 싶을 수도 있습니다. 이는 자동화된 프로세스나 백그라운드 작업에서 나중에 작업 결과를 검토할 수 있도록 자주 사용됩니다. 표준 출력과 표준 오류를 동일한 위치로 리디렉션하려면 &> 또는 &>> 연산자를 사용합니다. 대체 옵션은 파일 설명자를 리디렉션하는 것입니다. N그런 다음 파일 설명자 m>&n 또는 m>>&n 구조를 사용하여 동일한 위치로 이동합니다. 이 경우 스레드가 리디렉션되는 순서가 중요합니다. 예를 들어 다음 명령은
명령 2>&1 >output.txt
그것은 명령과 동일하지 않습니다
명령 >output.txt 2>&1
첫 번째 경우에는 오류 스트림 stderr이 stdout 스트림의 현재 위치로 리디렉션된 다음 stdout 스트림이 출력.txt 파일로 리디렉션됩니다. 그러나 두 번째 리디렉션은 stdout에만 영향을 미치고 stderr에는 영향을 미치지 않습니다. 두 번째 경우에는 stderr 스트림이 stdout 스트림의 현재 위치, 즉 output.txt 파일로 리디렉션됩니다. 이러한 리디렉션은 목록 5에 설명되어 있습니다. 마지막 명령에서 표준 출력이 표준 오류 스트림 다음에 리디렉션되었으며 결과적으로 오류 스트림이 터미널 창에 계속 출력된다는 점에 유의하세요.

목록 5. 두 개의 스트림을 하나의 파일로 리디렉션
$ ls x* z* &>output.txt $ cat output.txt ls: 액세스할 수 없습니다 z*: 해당 파일이나 디렉터리가 없습니다 xaa xab $ ls x* z* >output.txt 2>&1 $ cat output.txt ls: can access z*: 해당 파일이나 디렉터리가 없습니다 xaa xab $ ls x* z* 2>&1 >output.txt # stderr는 output.txt로 이동하지 않습니다. ls: 액세스할 수 없습니다 z*: 해당 파일이나 디렉터리가 없습니다 $ cat 출력. txt xaa xab

다른 상황에서는 표준 출력이나 표준 오류를 완전히 무시할 수도 있습니다. 이렇게 하려면 해당 스트림을 빈 파일 /dev/null로 리디렉션합니다. 목록 6에서는 ls 오류 스트림을 무시하는 방법과 cat 명령을 사용하여 /dev/null이 실제로 비어 있는지 확인하는 방법을 보여줍니다.

목록 6. /dev/null을 사용하여 표준 오류 무시
$ ls x* z* 2>/dev/null xaa xab $ cat /dev/null

입력 리디렉션

stdout 및 stderr을 리디렉션할 수 있는 것처럼 연산자를 사용하여 파일에서 stdin을 리디렉션할 수 있습니다.<. Если вы прочли руководство " ", то должны помнить, что в разделе была использована команда tr для замены пробелов в файле text1 на символы табуляции. В том примере мы использовали вывод команды cat чтобы создать стандартный поток ввода для команды tr . Теперь для преобразования пробелов в символы табуляции вместо бесполезного вызова команды cat мы можем использовать перенаправление ввода, как показано в листинге 7.

목록 7. 입력 리디렉션
$ tr " " "\t"

Bash를 포함한 명령 해석기가 개념을 구현합니다. 여기 문서, 이는 입력을 리디렉션하는 방법 중 하나입니다. 디자인을 활용한 것입니다<< и какое-либо слово, например END, являющееся маркером, или сигнальной меткой, означающей конец ввода. Эта концепция продемонстрирована в листинге 8.

목록 8. here-document 개념을 사용하여 입력 리디렉션
$sort -k2<사과 1개 > 배 2개 > 바나나 3개 > END 사과 1개 바나나 3개 배 2개

하지만 왜 sort -k2 명령을 입력하고 데이터를 입력한 다음 조합을 누를 수 없나요? Ctrl-d, 입력이 끝났음을 나타냅니다. 물론 이 명령을 실행할 수 있지만 그러면 쉘 스크립트에서 매우 일반적인(입력으로 허용되어야 하는 행을 지정하는 다른 방법이 없는) here-document 개념에 대해 알지 못할 것입니다. 탭은 텍스트를 정렬하고 읽기 쉽게 만들기 위해 스크립트에서 널리 사용되므로 here-document 개념을 사용하는 또 다른 기술이 있습니다. 연산자를 사용하는 경우<<- вместо оператора << начальные символы табуляции удаляются.

목록 9에서는 명령 대체를 사용하여 탭 문자를 만든 다음 각각 here-document 블록에서 데이터를 읽는 두 개의 cat 명령이 포함된 작은 쉘 스크립트를 만들었습니다. 터미널에서 읽고 있는 여기 문서 블록을 알리기 위해 END라는 단어를 사용했다는 점에 유의하세요. 스크립트에서 이와 동일한 단어를 사용하면 입력이 조기에 종료됩니다. 따라서 스크립트에서는 END라는 단어 대신 EOF라는 단어를 사용합니다. 스크립트가 생성되면 명령을 사용합니다. (점)은 현재 쉘의 컨텍스트에서 실행합니다.

목록 9. here-document 개념을 사용하여 입력 리디렉션
$ ht=$(echo -en "\t") $ 고양이<ex-here.sh > 고양이<<-EOF >사과 > EOF > $(ht)cat<<-EOF >$(ht)pear > $(ht)EOF > END $ cat ex-here.sh cat<<-EOF apple EOF cat <<-EOF pear EOF $ . ex-here.sh apple pear

이 시리즈의 향후 기사에서는 명령 대체 및 스크립팅에 대해 자세히 알아봅니다. 이 시리즈의 모든 기사에 대한 링크는 다음에서 찾을 수 있습니다.

파이프라인 만들기

xargs 명령 사용

xargs 명령은 표준 입력 장치에서 데이터를 읽은 다음 수신된 입력을 매개변수로 사용하는 명령을 구성하고 실행합니다. 명령을 지정하지 않으면 echo 명령이 사용됩니다. 목록 12에서는 각각 두 단어로 구성된 세 줄이 포함된 text1 파일을 사용하는 간단한 예를 보여줍니다.

목록 12. xargs 명령 사용
$ 고양이 text1 사과 1개 배 2개 바나나 3개 $ xargs

그러면 xargs 출력에 한 줄만 포함되는 이유는 무엇입니까? 기본적으로 xargs는 구분 기호 문자가 나타나면 입력을 분할하고 각 결과 조각은 별도의 매개 변수가 됩니다. 그러나 xargs가 명령을 빌드할 때 한 번에 가능한 많은 매개변수가 전달됩니다. 이 동작은 –n 또는 --max-args 옵션을 사용하여 변경할 수 있습니다. 목록 13에서는 두 옵션의 예를 보여줍니다. xargs와 함께 사용하기 위해 echo 명령에 대한 명시적인 호출도 이루어졌습니다.

목록 13. xargs 및 echo 명령 사용
$xargs " args > 1 사과 2 배 3 바나나 $ xargs --max-args 3 " args > 사과 1개 인수 2개 > 배 3개 바나나 $ xargs -n 1 " args > 1개 args > apple args > 2개 args > pear args > 3개 args > 바나나

입력에 공백이 포함되어 있지만 작은따옴표나 큰따옴표로 묶인 경우(또는 공백이 백슬래시를 사용하여 이스케이프된 경우) xargs는 이를 별도의 부분으로 분할하지 않습니다. 이는 목록 14에 나와 있습니다.

목록 14. xargs 명령 및 따옴표 사용
$ echo ""자두 4개"" | cat text1 - 사과 1개 배 2개 바나나 3개 "4 자두" $ echo ""4 자두"" | 고양이 텍스트1 - | xargs -n 1 1 사과 2 배 3 바나나 4 자두

지금까지 모든 인수는 명령 끝에 추가되었습니다. 그 뒤에 다른 선택적 인수를 추가해야 하는 경우 -I 옵션을 사용하여 대체 문자열을 지정합니다. 대체 문자열이 사용되는 xargs를 통해 호출된 명령 지점에서 인수가 대신 대체됩니다. 이 접근 방식을 사용하면 각 명령에 하나의 인수만 전달됩니다. 그러나 인수는 별도의 조각이 아닌 전체 입력 문자열에서 생성됩니다. xargs 명령의 -L 옵션을 사용할 수도 있습니다. 그러면 공백으로 구분된 개별 조각이 아닌 전체 문자열이 인수로 사용됩니다. -I 옵션을 사용하면 암시적으로 -L 1 옵션이 사용됩니다. 목록 15에서는 -I 및 –L 옵션을 사용하는 예를 보여줍니다.

목록 15. xargs 명령 및 입력 행 사용
$ xargs -I XYZ echo "START XYZ REPEAT XYZ END" " <9 plum> <3 banana><3 banana> <10 apple><10 apple>$ 고양이 텍스트1 텍스트2 | xargs -L2 사과 1개 배 2개 바나나 3개 자두 9개 바나나 3개 사과 10개

예제에서는 간단한 텍스트 파일을 사용하지만 이러한 경우에는 xargs 명령을 자주 사용하지 않습니다. 일반적으로 ls , find 또는 grep 과 같은 명령으로 인해 발생하는 대규모 파일 목록을 처리하게 됩니다. 목록 16에서는 xargs에 디렉토리 내용 목록을 grep과 같은 명령에 전달하는 한 가지 방법을 보여줍니다.

목록 16. xargs 명령 및 파일 목록 사용
$ ls |xargs grep "1" text1:1 apple text2:10 apple xaa:1 apple yaa:1

마지막 예에서 하나 이상의 파일 이름에 공백이 포함되어 있으면 어떻게 됩니까? 목록 16과 같이 명령을 사용하려고 하면 오류가 발생합니다. 실제 상황에서는 파일 목록을 ls 명령에서 얻을 수 없지만, 예를 들어 사용자 스크립트나 명령을 실행한 결과로 얻을 수 있습니다. 또는 추가 필터링을 위해 파이프라인의 다른 단계에서 처리할 수도 있습니다. 따라서 우리는 기존 논리 구조 대신 단순히 grep "1" *을 사용할 수 있다는 사실을 고려하지 않습니다.

ls 명령의 경우 --quoting-style 옵션을 사용하여 공백이 포함된 파일 이름을 괄호로 묶거나 이스케이프하도록 할 수 있습니다. 더 나은 해결책(가능한 경우)은 xargs 명령의 -0 옵션을 사용하는 것입니다. 이렇게 하면 빈 문자(\0)가 입력 인수를 구분하는 데 사용됩니다. ls 명령에는 널 종료 파일 이름을 출력으로 사용하는 옵션이 없지만 많은 명령이 이를 수행할 수 있습니다.

목록 17에서는 먼저 파일 text1을 "text 1"로 복사한 다음 xargs 명령으로 공백이 포함된 파일 이름 목록을 사용하는 몇 가지 예를 제공합니다. xargs 작업을 완전히 익히는 것이 쉽지 않을 수 있으므로 이러한 예는 아이디어를 이해하는 데 도움이 됩니다. 특히, 개행 문자를 빈 문자로 변환하는 마지막 예는 일부 파일 이름에 이미 개행 문자가 포함된 경우 작동하지 않습니다. 이 기사의 다음 섹션에서는 find 명령을 사용하여 널 문자를 구분 기호로 사용하는 적절한 출력을 생성하는 보다 강력한 솔루션을 살펴보겠습니다.

목록 17. xargs 명령 및 이름에 공백이 포함된 파일 사용
$ cp text1 "text 1" $ ls *1 |xargs grep "1" # error text1:1 apple grep: text: 해당 파일 또는 디렉터리가 없습니다 grep: 1: 해당 파일 또는 디렉터리가 없습니다 $ ls --quoting-style escape * 1 text1 text\ 1 $ ls --quoting-style shell *1 text1 "text 1" $ ls --quoting-style shell *1 |xargs grep "1" text1:1 apple text 1:1 apple $ # Illustrate -0 xargs의 옵션 $ ls *1 | tr "\n" "\0" |xargs -0 grep "1" text1:1 사과 텍스트 1:1 사과

xargs 명령은 임의로 긴 명령을 작성할 수 없습니다. 따라서 Linux에서는 커널 버전 2.26.3까지 최대 명령 길이가 제한되었습니다. rm somepath/*와 같은 명령을 실행하려고 하고 디렉터리에 긴 이름을 가진 많은 파일이 포함되어 있으면 인수 목록이 너무 길다는 오류와 함께 실패할 수 있습니다. 이러한 제한이 있을 수 있는 이전 버전의 Linux 또는 UNIX를 실행하는 경우 이러한 제한을 해결하는 방식으로 xargs를 사용할 수 있는 방법을 아는 것이 도움이 될 수 있습니다.

--show-limits 옵션을 사용하여 xargs 명령에 대한 기본 제한을 볼 수 있으며 -s 옵션을 사용하여 명령 출력의 최대 길이를 설정할 수 있습니다. 매뉴얼 페이지에서 다른 옵션에 대해 알아볼 수 있습니다.

-exec 옵션과 함께 또는 xargs 명령과 함께 find 명령 사용

" " 튜토리얼에서는 find 명령을 사용하여 이름, 수정 시간, 크기 및 기타 특성을 기준으로 파일을 찾는 방법을 배웠습니다. 일반적으로 발견된 파일에 대해 특정 작업(삭제, 복사, 이름 바꾸기 등)을 수행해야 합니다. 이제 find 명령과 유사하게 작동하고 xargs 명령에 출력을 전달하는 find 명령의 -exec 옵션을 살펴보겠습니다.

목록 18. -exec 옵션과 함께 find 사용
$ 텍스트 찾기 -exec cat text3()\; 이것은 문장입니다. 이것은 문장입니다. 이것은 문장입니다. 사과 1개 배 2개 바나나 3개 이것은 문장입니다. 이것은 문장입니다. 이것은 문장입니다. 자두 9개 바나나 3개 사과 10개

Listing 18의 결과를 xargs에 대해 이미 알고 있는 결과와 비교하면 몇 가지 차이점이 있습니다.

  1. ~ 해야 하다명령에서 () 기호를 사용하여 파일 이름이 대체될 대체 위치를 나타냅니다. 이러한 문자는 명령 끝에 자동으로 추가되지 않습니다.
  2. 명령은 이스케이프 처리해야 하는 세미콜론(\;, ";" 또는 ";")으로 끝나야 합니다.
  3. 명령은 각 입력 파일에 대해 한 번씩 실행됩니다.

차이점을 확인하려면 find text |xargs cat text3 을 직접 실행해 보세요.

이제 파일 이름에 공백이 포함된 경우로 돌아가 보겠습니다. 목록 19에서는 ls 및 xargs 명령 대신 -exec 옵션과 함께 find 명령을 사용해 보았습니다.

목록 19. -exec 옵션과 이름에 공백이 포함된 파일과 함께 find 명령 사용
$찾기. -name "*1" -exec grep "1" () \; 사과 1개 사과 1개

여태까지는 그런대로 잘됐다. 그런데 여기에 뭔가 빠졌다고 생각하지 않나요? grep으로 찾은 줄이 포함된 파일은 무엇입니까? 여기서 누락된 것은 파일 이름입니다. find는 각 파일에 대해 grep을 한 번 호출하고, 스마트 명령인 grep은 하나의 파일 이름만 주어진 경우 그것이 무엇인지 알려줄 필요가 없다는 것을 알고 있습니다.

이 상황에서는 xargs 명령을 사용할 수 있지만 이름에 공백이 포함된 파일의 문제에 대해 이미 알고 있습니다. 또한 -print0 옵션 덕분에 find 명령이 널로 구분된 이름 목록을 생성할 수 있다는 사실도 언급했습니다. 최신 버전의 find 명령은 세미콜론이 아닌 + 기호로 구분할 수 있으므로 xargs를 사용할 때와 마찬가지로 find 명령에 대한 한 번의 호출로 가능한 최대 개수의 이름을 전달할 수 있습니다. 말할 필요도 없이 이 경우 () 구문은 한 번만 사용할 수 있으며 이는 명령의 마지막 매개변수여야 합니다. 목록 20에서는 이 두 가지 방법을 모두 보여줍니다.

목록 20. find , xargs 및 이름에 공백이 포함된 파일 사용
$찾기. -name "*1" -print0 |xargs -0 grep "1" ./text 1:1 apple ./text1:1 apple $ find . -name "*1" -exec grep "1" () + ./text 1:1 사과 ./text1:1 사과

이 두 가지 방법 모두 효과가 있으며 둘 중 하나를 선택하는 것은 종종 사용자의 개인적 선호도에 의해서만 결정됩니다. 원시 구분 기호와 공백이 있는 객체를 파이핑할 때 문제가 발생할 수 있다는 점에 유의하세요. 따라서 출력을 xargs 에 전달하는 경우 find 의 -print0 옵션과 xargs 의 -0 옵션을 사용하세요. 이는 입력에 null 구분 기호를 사용하도록 지시합니다. tar 를 포함한 다른 명령도 -0 옵션을 지원하고 null로 구분된 입력 작업을 지원하므로 입력 목록에서 문제가 발생하지 않을 것이라고 100% 확신하지 않는 한 이를 지원하는 명령에 항상 이 옵션을 사용해야 합니다.

마지막 의견은 파일 목록 작업에 관한 것입니다. 일괄 작업(예: 여러 파일 삭제 또는 이름 바꾸기)을 수행하기 전에 항상 목록과 명령을 주의 깊게 확인하는 것이 좋습니다. 필요할 때 최신 백업을 유지하는 것도 매우 중요할 수 있습니다.

출력 분할

이 기사를 마무리하기 위해 명령을 하나 더 살펴보겠습니다. 때로는 화면에서 출력을 보고 동시에 파일에 저장해야 할 수도 있습니다. 이를 위해 당신은 우리는 할 수 있었다한 창에서 명령 출력을 파일로 리디렉션한 다음 tail -fn1을 사용하여 다른 창에서 출력을 추적하지만 가장 쉬운 방법은 tee 명령을 사용하는 것입니다.

tee 명령은 파이프에서 사용되며 해당 인수는 표준 출력이 파이프될 파일 이름(또는 여러 파일 이름)입니다. -a 옵션을 사용하면 파일의 이전 내용을 새 내용으로 바꾸는 것이 아니라 파일 끝에 데이터를 추가할 수 있습니다. 파이프라이닝에 대해 논의할 때 설명한 대로 표준 출력과 오류 스트림을 모두 저장하려면 데이터를 tee 명령에 입력으로 전달하기 전에 stderr를 stdout으로 리디렉션해야 합니다. 목록 21에서는 tee 명령을 사용하여 f1과 f2라는 두 파일에 출력을 저장하는 예를 보여줍니다.

목록 21. tee 명령을 사용하여 stdout 분할
$ ls 텍스트|티 f1 f2 텍스트1 텍스트2 텍스트3 $ 고양이 f1 텍스트1 텍스트2 텍스트3 $ 고양이 f2 텍스트1 텍스트2 텍스트3

명령 리디렉션 연산자는 명령 입력 및 출력 스트림의 기본 위치를 다른 위치로 변경하는 데 사용됩니다. 입력 및 출력 스트림의 위치를 ​​핸들이라고 합니다.

다음 표에서는 명령 입력 및 출력 리디렉션 연산자에 대해 설명합니다.

리디렉션 연산자설명
> 명령줄 대신 명령의 출력을 파일이나 프린터와 같은 장치에 기록합니다.
< 키보드가 아닌 파일에서 명령 입력 스트림을 읽습니다.
>> 파일에서 기존 정보를 제거하지 않고 파일 끝에 명령 출력을 추가합니다.
>& 한 설명자의 출력을 다른 설명자의 입력으로 읽습니다.
<& 한 핸들의 입력을 다른 핸들의 출력으로 읽습니다.
| 한 명령의 출력을 읽고 이를 다른 명령의 입력에 씁니다. 이 절차를 채널링이라고 합니다.

기본적으로 명령 입력(STDIN 핸들)은 키보드에서 명령 해석기 Cmd.exe로 전송된 다음 Cmd.exe는 명령 출력(STDOUT 핸들)을 명령 프롬프트 창으로 보냅니다.

다음 표에서는 사용 가능한 설명자를 보여줍니다.

0부터 9까지의 숫자는 처음 10개의 설명자를 나타냅니다. Cmd.exe 명령 해석기는 프로그램을 실행하고 10개의 핸들 중 하나를 리디렉션하는 데 사용됩니다. 필요한 핸들을 지정하려면 리디렉션 연산자 앞에 해당 번호를 입력합니다. 핸들이 정의되지 않은 경우 기본적으로 입력 리디렉션 연산자 "<» будет ноль (0), а оператором перенаправления вывода «>"는 하나(1)가 됩니다. 연산자를 입력한 후 "<» или «>"데이터를 읽을 위치와 쓸 위치를 나타내는 것이 필요합니다. 파일 이름이나 기존 설명자를 지정할 수 있습니다.

기존 핸들로 리디렉션을 지정하려면 앰퍼샌드(&) 뒤에 원하는 핸들 번호를 사용하세요(예: & 핸들_번호). 예를 들어 핸들 2(STDERR)를 핸들 1(STDOUT)로 리디렉션하려면 다음을 입력합니다.

중복된 설명자

리디렉션 연산자 "&"는 지정된 한 핸들의 출력 또는 입력을 지정된 다른 핸들로 복제합니다. 예를 들어, dir 명령의 출력을 File.txt로 보내고 오류 출력을 File.txt로 보내려면 다음을 입력합니다.

디렉토리>c:\file.txt 2>&1

설명자를 복제하면 원래 특성이 모두 복사됩니다. 예를 들어, 핸들이 쓰기 전용이면 모든 중복 항목도 쓰기 전용이 됩니다. 읽기 전용 핸들을 쓰기 전용 핸들로 복제할 수 없습니다.

명령 입력 리디렉션(<)

숫자 키패드 명령을 파일이나 장치로 리디렉션하려면 "<». Например, для ввода команды sort из файла List.txt введите:

종류

File.txt의 내용은 명령줄에 알파벳 순서로 목록으로 표시됩니다.

운영자 "<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

메모

  • 핸들 0은 입력 리디렉션 연산자의 기본값입니다.<».

명령 출력 리디렉션(>)

거의 모든 명령의 출력이 명령 프롬프트 창에 표시됩니다. 데이터를 디스크나 프린터로 출력하는 명령도 명령 프롬프트 창에 메시지와 프롬프트를 생성합니다.

명령 프롬프트 창의 명령 출력을 파일이나 장치로 리디렉션하려면 ">" 연산자를 사용합니다. 이 연산자는 대부분의 명령에 사용됩니다. 예를 들어, dir 명령의 출력을 Dirlist.txt 파일로 경로 재지정하려면 다음을 입력하십시오.

디렉토리>dirlist.txt

Dirlist.txt 파일이 없으면 Cmd.exe 명령 인터프리터가 해당 파일을 만듭니다. 파일이 있으면 Cmd.exe는 파일의 정보를 명령에서 받은 데이터로 바꿉니다. 디렉토리.

명령을 실행하려면 netsh 라우팅 덤프그런 다음 작업 결과를 Route.cfg로 보내고 다음을 입력합니다.

netsh 라우팅 덤프 > c:\route.cfg

">" 연산자는 쓰기 전용 액세스로 지정된 파일을 엽니다. 따라서 이 연산자를 사용하여 파일을 읽을 수 없습니다. 예를 들어 리디렉션 연산자를 사용하여 프로그램을 실행할 때<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

메모.

  • 핸들 1은 출력 리디렉션 연산자 ">"의 기본값입니다.

연산자 사용 "<&» для перенаправления ввода и дублирования

입력 리디렉션 연산자를 사용하려면 지정되는 파일이 이미 존재해야 합니다. 입력 파일이 있으면 Cmd.exe 명령 해석기는 읽기 전용 액세스로 해당 파일을 열고 해당 내용을 숫자 키패드 입력인 것처럼 명령에 보냅니다. 핸들이 지정되면 Cmd.exe 명령 해석기는 핸들을 시스템에 있는 핸들에 복제합니다.

예를 들어, File.txt를 입력 설명자 0(STDIN)으로 읽으려면 다음을 입력하십시오.

File.txt 파일을 열려면 해당 내용을 정렬한 다음 명령 프롬프트 창(STDOUT)으로 보내려면 다음을 입력합니다.

종류< file.txt

File.txt를 찾고 핸들 1(STDOUT)과 핸들 2(STDERR)를 Search.txt로 경로 재지정하려면 다음을 입력하십시오.

findfile file.txt>search.txt 2<&1

사용자 정의 설명자 3을 설명자 0(STDIN)에 대한 입력으로 복제하려면 다음을 입력하십시오.

">&" 연산자를 사용하여 입력 리디렉션 및 복제

출력을 파일로 리디렉션하고 기존 파일 이름을 지정하면 Cmd.exe 명령 해석기는 쓰기 전용 액세스로 파일을 열고 해당 내용을 덮어씁니다. 핸들이 지정되면 Cmd.exe 명령 해석기는 파일을 기존 핸들에 복제합니다.

사용자 정의 설명자 3을 설명자 1에 복제하려면 다음을 입력하십시오.


설명자 2 출력(STDERR)을 포함한 모든 출력을 리디렉션하려면 다음 명령을 사용하세요. IP구성핸들 1(STDOUT)에 넣은 다음 출력을 Output.log로 리디렉션하고 다음을 입력합니다.


ipconfig.exe>>output.log 2>&1

">>" 연산자를 사용하여 출력 추가

저장된 정보를 잃지 않고 파일 끝에 명령 출력을 추가하려면 두 배보다 큰 문자(>>)를 사용합니다. 예를 들어, 다음 명령은 다음 명령으로 생성된 디렉터리 목록을 추가합니다. 디렉토리, Dirlist.txt 파일에:


디렉토리>>dirlist.txt

명령 출력을 추가하려면 netstat Tcpinfo.txt 파일 끝에 다음을 입력합니다.


netstat>>tcpinfo.txt

때로는 다음과 같이 작성하는 것이 더 편리할 때도 있습니다.

SET OutFile="%~n0.html" > %OutFile% ECHO ^ >> %OutFile% 에코 ^ >> %OutFile% 에코 ^ 최고의 페이지^>> %OutFile% 에코 ^>> %OutFile% 에코 ^ >> %OutFile% ECHO Hello World >> %OutFile% ECHO ^>> %OutFile% 에코 ^

채널 연산자(|) 사용

수직선 파이프 연산자(|)는 한 명령(기본값 STDOUT)의 출력을 가져와 다른 명령(기본값 STDIN)의 입력으로 지정합니다. 예를 들어 다음 명령은 디렉터리를 정렬합니다.

이 예에서는 두 명령이 동시에 실행되지만 명령은 종류명령 출력이 수신될 때까지 일시 중지됩니다. 디렉토리. 팀 종류명령 출력을 사용합니다 디렉토리입력으로 사용하고 출력을 설명자 1(STDOUT)로 보냅니다.

리디렉션 연산자와 명령 결합

필터 명령을 다른 명령 및 파일 이름과 결합하여 사용자 정의 명령을 만들 수 있습니다. 예를 들어 "LOG"라는 문자열이 포함된 파일 이름을 저장하려면 다음 명령을 사용합니다.

디렉토리 /b | "로그" > loglist.txt를 찾으세요.

명령 출력 디렉토리필터 명령으로 전송됨 찾다. "LOG" 문자열이 포함된 파일 이름은 Loglist.txt 파일에 목록으로 저장됩니다(예: NetshConfig.log, Logdat.svd 및 Mylog.bat).

하나의 명령에 두 개 이상의 필터를 사용하는 경우 파이프(|)를 사용하여 구분해야 합니다. 예를 들어, 다음 명령은 C 드라이브의 각 디렉터리에서 이름에 "Log"라는 문자열이 있는 파일을 검색하여 페이지별로 표시합니다.

디렉토리 c:\ /s /b | "로그" 찾기 | 더

파이프(|)가 있으면 cmd.exe에 DIR 명령의 출력이 필터 명령으로 전송되어야 함을 알립니다. 찾다. find 명령은 "LOG" 문자열이 포함된 파일 이름만 선택합니다. more 명령은 명령으로 얻은 파일 이름을 표시합니다. 찾다각 화면이 채워지면 잠시 멈춥니다. 필터 명령에 대한 자세한 내용은 다음을 참조하세요.

좋은 시간 되세요, 독자 여러분!
이 기사에서는 기본 원칙에 따라 지식을 체계화하고 싶습니다. 프로그램 스트림 및 채널 운영통역사와 일반적으로 Linux OS 및 가능성에 대해 리디렉션데이터 스트림.
맨 처음에는 인터프리터가 세 가지 표준 스트림으로 작동한다는 점에 주목하고 싶습니다.

  1. 표준 출력 이것 표준 출력, 명령의 출력을 제공합니다. 스트림 설명자는 1입니다.
  2. 표준 오류 이것 표준 오류 스트림, 명령 오류를 인쇄합니다. 설명자는 2입니다.
  3. 표준 입력 이것 표준 입력, 명령에 대한 입력을 제공합니다. 설명자는 0입니다.

이제 이 세 가지 요점이 무엇을 의미하는지 간단한 단어로 설명하겠습니다.

표준 출력- 표준 출력 스트림. 간단히 말해서 이는 명령을 실행할 때 인터프리터에서 보는 정보입니다. 즉, 인터프리터에서 실행된 명령이 터미널(읽기: 화면)에 보고하고 표시하는 모든 메시지(오류 메시지 없음)입니다. (화면 출력은 기본적으로 설정되어 있지만 파일로 출력하거나 다른 명령으로 리디렉션하는 등의 출력을 지정할 수도 있습니다. 이 작업이 수행되는 방법은 아래에서 설명하겠습니다.)

표준 오류- 오류의 흐름. 이는 bash에서 명령을 실행할 때 발생하는 오류로, 기본적으로 stdout, 즉 터미널로 출력됩니다(다시 말하지만, 다른 위치로의 출력이 지정되지 않은 경우).

표준 입력- 입력 스트림. 간단히 말해서 이것은 명령을 실행하기 위해 키보드에서 인터프리터로 입력하는 것입니다.

이러한 흐름은 http://rus-linux.net/에서 가져온 그림에 매우 잘 설명되어 있습니다.

이 이미지에서: 녹색으로 표시된 Stdin에는 핸들 0이 있습니다.
빨간색으로 표시된 Stdout에는 핸들 1이 있습니다.
파란색으로 표시된 Stderr에는 핸들 2가 있습니다.

다음으로 이러한 스트림을 파일로/에서 리디렉션하는 방법을 설명하겠습니다. 즉, 명령을 실행할 때 메시지나 오류가 화면에 표시되지 않고 파일에 기록되도록 합니다. 그것은 무엇을 위한 것입니까? 예를 들어, 출력이 터미널 창에 맞지 ​​않는 일부 명령을 실행하고 있습니다. 표준 출력을 한 파일에 저장하고 표준 오류를 다른 파일에 저장하도록 지시합니다. 따라서 모든 오류와 표준 출력이 필요한 경우 저장된 파일을 열어 자세히 볼 수 있습니다.

따라서 스레드 리디렉션은 다음과 같이 수행됩니다.

$ 명령 n>파일

이 줄은 다음을 보여줍니다: 명령 실행 명령및 흐름 리디렉션(여기서 N= 스트림 핸들)을 파일로 파일.이 리디렉션을 수행할 때 대상 파일이 존재하면 덮어썼다. 이 경우 n을 지정하지 않으면 표준 출력이 가정됩니다.

$ 명령 n>>파일

이 명령은 구문이 비슷하지만 여기서는 ">>" 기호가 지정됩니다. 이 리디렉션을 사용하면 대상 파일이 존재하는 경우 명령 출력이 기존 데이터에 추가됩니다.

$명령< file

이 예에서는 명령 명령실행되어 파일을 입력 소스로 사용합니다. 파일,키보드 입력 대신

오류와 일반 프로그램 출력이 함께 처리될 수 있도록 표준 오류 스트림을 표준 출력 스트림과 결합해야 하는 경우도 있습니다. 이러한 목적을 위해 & 기호와의 조합이 사용됩니다. 이 작업의 예:

/ -name .name_file > /path/to/file 2>&1 찾기

이 명령을 실행하면 파일 시스템의 루트에서 다음 이름의 파일을 검색합니다. .name_file검색 결과(stdout 및 stderr)를 파일로 리디렉션 /경로/대상/파일. 설계 > /경로/대상/파일 2>&1표준 출력을 다음으로 리디렉션합니다. /경로/대상/파일오류를 표준 출력으로 인쇄합니다. 즉, > 앞에 2>&1을 쓰면 통역사가 2>&1을 읽을 때 표준 출력 스트림이 리디렉션되는 위치를 아직 알지 못하므로 오류와 출력 스트림이 병합되지 않기 때문에 작동하지 않습니다.

$ 명령 > 파일 2>&1

글쓰기와 유사:

$ 명령 &> 파일

$ 명령 2>&파일

출력을 무시해야 하는 경우 출력은 /dev/null 장치로 지정될 수 있습니다. 이는 임의의 양의 정보를 가져와 아무것도 아닌 것으로 바꾸는 일종의 "블랙홀"입니다.

흐름 방향 전환에 대해 제공되는 정보는 본질을 이해하기에 충분할 것이라고 생각합니다. 이제 컨베이어 이송.

Linux의 파이프라인 중간 임시 파일을 사용하지 않고 한 프로그램의 출력이 다른 프로그램의 입력으로 직접 전송될 때 여러 프로그램이 함께 작동하는 기능입니다. 파이프라인을 사용하기 위한 구문은 다음과 같습니다.

$명령1 | 명령 2

이 예에서는 명령이 실행됩니다. 명령1, 출력 스트림은 실행 시 입력 스트림으로 사용됩니다. 명령 2.

오늘은 그게 다야. 나는 의견과 추가 사항을 기쁘게 받아들일 것입니다. 감사합니다.

감사합니다, McSim!



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: