웹사이트 검색

Linux I/O 리디렉션 소개


소개

Linux에 내장된 리디렉션 기능은 많은 워크플로우를 최적화하기 위한 강력한 도구 세트를 제공합니다. 소프트웨어 개발의 "Unix 철학\은 각각 한 가지를 잘 수행하는 도구를 만드는 것이었고, 이 철학은 개별적으로 강력하고 결합될 때 기하급수적으로 더 강력해지는 최신 명령줄 도구로 이어졌습니다. 복잡한 소프트웨어를 작성하거나 명령줄에서 작업하고 환경에서 다양한 I/O 스트림을 조작하는 방법을 알면 생산성이 크게 향상됩니다.

전제 조건

이 가이드를 따라 하려면 Linux 서버에 대한 액세스 권한이 있어야 합니다. 서버에 처음 연결하는 방법에 대한 정보가 필요한 경우 SSH를 사용하여 Linux 서버에 연결하는 방법에 대한 가이드를 따를 수 있습니다.

스트림

Linux 환경의 입력 및 출력은 세 개의 스트림에 분산됩니다. 이러한 스트림은 다음과 같습니다.

  • 표준 입력(stdin)\n
  • 표준 출력(stdout)\n
  • 표준 오류(stderr)\n

스트림에도 번호가 매겨져 있습니다.

  • 표준입력(0)\n
  • 표준출력(1)\n
  • 표준 오류 (2)\n

사용자와 터미널 간의 표준 상호 작용 중에 표준 입력은 사용자의 키보드에서 나옵니다. 표준 출력과 표준 오류는 사용자의 단말기에 텍스트로 표시됩니다. 총체적으로 세 가지 스트림을 표준 스트림이라고 합니다.

표준 입력

표준 입력 스트림은 일반적으로 사용자에서 프로그램으로 데이터를 전달합니다. 표준 입력이 필요한 프로그램은 일반적으로 키보드와 같은 장치에서 입력을 받습니다. 이 자습서의 뒷부분에서 한 프로그램의 출력을 다른 프로그램의 표준 입력으로 사용하는 예를 볼 수 있습니다.

표준 출력

표준 출력은 프로그램에 의해 생성되는 출력입니다. 표준 출력 스트림이 리디렉션되지 않으면 터미널에 직접 텍스트를 출력합니다. echo를 사용하여 임의의 텍스트를 출력해 보십시오.

  1. echo Sent to the terminal
Output
Sent to the terminal

추가 옵션 없이 사용할 경우 echo 명령은 명령줄에서 전달된 모든 인수를 출력합니다.

인수 없이 에코를 실행합니다.

  1. echo

빈 줄을 반환합니다. 일부 프로그램은 제공된 인수 없이는 아무 작업도 수행하지 않습니다.

표준 에러

표준 오류에는 어떤 방식으로든 실패한 프로그램에서 생성된 오류가 포함됩니다. 표준 출력과 마찬가지로 이 스트림의 기본 대상은 터미널 디스플레이입니다.

ls 명령을 사용하여 표준 오류의 기본 예를 살펴보겠습니다. ls는 디렉토리의 내용을 나열합니다.

인수 없이 실행하면 ls는 현재 디렉토리 내의 내용을 나열합니다. ls가 디렉터리를 인수로 사용하여 실행되면 제공된 디렉터리의 내용이 나열됩니다.

  1. ls %

%는 기존 디렉토리가 아니므로 표준 오류에 다음 텍스트를 보냅니다.

Output
ls: cannot access %: No such file or directory

프로그램은 표준 오류를 생성하기 위해 충돌하거나 실행을 종료할 필요가 없으며 일부 출력이 표준 출력 또는 표준 오류로 전송되는지 여부는 프로그램의 동작에 달려 있습니다. 그것들은 어떤 식으로든 기술적으로 서로 다르지 않습니다. 단지 하나의 출력 스트림이 오류 메시지를 위해 예약되어 있어야 하며 일부 도구는 표준 오류가 비어 있다는 것은 프로그램이 성공적으로 실행되었음을 의미한다고 가정합니다. 일부 프로그램은 의도한 출력을 생성하지 못하거나 충돌 없이 표준 오류에 사소한 오류를 출력하기도 합니다. 의도하지 않은 출력과 의도한 출력을 구분하기 위한 규칙으로만 사용됩니다.

스트림 리디렉션

Linux에는 각 스트림에 대한 리디렉션 명령이 포함되어 있습니다. 표준 출력이나 표준 오류를 파일에 쓰는 데 사용할 수 있습니다. 존재하지 않는 파일에 쓰는 경우 쓰기 전에 해당 이름의 새 파일이 생성됩니다.

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

덮어쓰기

  • > - 표준 출력\n
  • < - 표준 입력\n
  • 2> - 표준 오류\n

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

추가

  • >> - 표준 출력\n
  • << - 표준 입력\n
  • 2>> - 표준 오류\n

파이프

파이프는 한 프로그램에서 다른 프로그램으로 스트림을 리디렉션하는 데 사용됩니다. 프로그램의 표준 출력이 파이프를 통해 다른 프로그램으로 전송될 때 첫 번째 프로그램의 출력은 터미널에 인쇄되지 않고 두 번째 프로그램의 입력으로 사용됩니다. 두 번째 프로그램에서 반환된 데이터만 표시됩니다.

Linux 파이프는 수직 막대로 표시됩니다: |

다음은 파이프를 사용하는 명령의 예입니다.

  1. ls | less

이것은 현재 디렉토리의 내용을 표시하는 ls의 출력을 가져와 파이프하여 less 프로그램으로 보냅니다. less는 전송된 데이터를 한 번에 한 줄씩 표시합니다.

ls는 일반적으로 여러 행에 걸쳐 디렉토리 내용을 표시합니다. less를 통해 실행하면 각 항목이 새 줄에 배치됩니다.

파이프의 기능이 >>>의 기능과 비슷해 보일 수 있지만 차이점은 파이프가 한 명령에서 다른 명령으로 데이터를 리디렉션하는 반면 > 및 > > 파일로만 리디렉션하는 데 사용됩니다.

필터

필터는 일반적으로 다른 프로그램에서 파이프된 출력과 함께 사용되는 프로그램 클래스입니다. 그들 중 다수는 그 자체로도 유용하지만 배관 동작을 특히 잘 보여줍니다.

  • 찾기 - 찾기에 전달된 인수와 일치하는 파일 이름을 가진 파일을 반환합니다.\n
  • grep - grep에 전달된 문자열 패턴과 일치하는 텍스트를 반환합니다.\n
  • tee - 표준 입력을 표준 출력과 하나 이상의 파일로 리디렉션합니다.\n
  • tr - 한 문자열을 찾아 다른 문자열로 바꿉니다.\n
  • wc - 문자, 행 및 단어를 계산합니다.\n

리디렉션, 파이핑 및 기본 필터를 소개했으므로 몇 가지 일반적인 리디렉션 패턴과 예를 살펴보겠습니다.

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

  1. ls ~ > root_dir_contents.txt

위의 명령은 홈 디렉터리(~)의 내용을 표준 출력으로 전달하고 출력을 root_dir_contents.txt라는 파일에 기록합니다. 단일 대괄호 명령이므로 파일의 이전 내용을 모두 삭제합니다.

command > /dev/null 패턴은 표준 출력을 아무데도 리디렉션하지 않습니다. /dev/null은 리디렉션되는 모든 데이터를 삭제하는 데 사용되는 특수 파일입니다. 필요하지 않고 명령이나 스크립트의 기능을 방해할 수 있는 표준 출력을 폐기하는 데 사용됩니다. /dev/null로 전송된 모든 출력은 삭제됩니다.

  1. ls > /dev/null

이 명령은 ls 명령에서 반환된 표준 출력 스트림을 /dev/null에 전달하여 버립니다.

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

  1. mkdir '' 2> mkdir_log.txt

이렇게 하면 잘못된 디렉터리 이름 에 의해 발생한 오류가 리디렉션되어 log.txt에 기록됩니다. 오류는 여전히 터미널로 전송되고 텍스트로 표시됩니다.

command >> file 패턴은 파일의 기존 내용을 덮어쓰지 않고 명령의 표준 출력을 파일로 리디렉션합니다.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

이 명령 쌍은 먼저 echo를 통해 사용자가 입력한 텍스트를 새 파일로 리디렉션합니다. 그런 다음 내용을 덮어쓰지 않고 두 번째 echo 명령으로 받은 텍스트를 기존 파일에 추가합니다.

위의 명령 2>> 파일 패턴은 명령의 표준 오류 스트림을 파일의 기존 내용을 덮어쓰지 않고 파일로 리디렉션합니다. 이 패턴은 로그 파일이 기록될 때마다 이전 내용이 지워지지 않으므로 프로그램이나 서비스에 대한 오류 로그를 만드는 데 유용합니다.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

위의 명령은 잘못된 찾기 인수로 인해 발생하는 오류 메시지를 stderr_log.txt라는 파일로 리디렉션합니다. 그런 다음 잘못된 wc 인수로 인해 발생하는 오류 메시지를 동일한 파일에 추가합니다.

<코드>명령 | command 패턴은 첫 번째 명령의 표준 출력을 두 번째 명령의 표준 입력으로 리디렉션합니다.

  1. find /var lib | grep deb

이 명령은 /var 및 해당 하위 폴더에서 문자열 deb와 일치하는 파일 이름 및 확장자를 검색하고 각 경로에서 일치하는 부분이 빨간색으로 강조 표시된 파일의 파일 경로를 반환합니다.

<코드>명령 | tee file 패턴(tee 명령 포함)은 명령의 표준 출력을 파일로 리디렉션하고 그 내용을 덮어씁니다. 그런 다음 리디렉션된 출력을 터미널에 표시합니다. 파일이 아직 존재하지 않으면 새 파일을 만듭니다.

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

  1. wc /etc/magic | tee magic_count.txt

이렇게 하면 /etc/magic 파일(Linux 셸에서 파일 유형을 결정하는 데 사용됨)의 문자, 행 및 단어 수를 tee 명령으로 파이프한 다음 wc 를 분할합니다. 의 출력을 두 방향으로 전송하여 터미널 디스플레이와 magic_count.txt 파일로 보냅니다. tee 명령의 경우 문자 T를 상상해 보십시오. 문자의 아래쪽 부분은 초기 데이터이고 위쪽 부분은 두 가지 다른 방향(표준 출력 및 터미널)으로 분할되는 데이터입니다.

여러 파이프를 사용하여 여러 명령 및/또는 필터 간에 출력을 리디렉션할 수 있습니다.

결론

Linux 명령줄에 내장된 리디렉션 기능을 사용하는 방법을 배우는 것은 중요한 기술입니다. 리디렉션 및 파이프 작동 방식에 대한 기본 사항을 살펴보았으므로 이제 이 가이드에서 강조한 프로그램과 패턴을 자주 사용하는 셸 스크립팅의 세계로 여행을 시작할 수 있습니다.

특정 명령을 검색하거나 명령줄에서 수행하려는 작업(예: "대문자로 시작하는 디렉토리의 모든 파일 삭제\)을 검색하는 것도 다음을 사용하여 특정 작업을 수행해야 할 때 유용할 수 있습니다. 명령줄.