리눅스 명령어 줄에서 파이프와 리디렉션 이해하기
리눅스 명령어 줄 셸의 두 가지 강력한 기능은 리디렉션과 파이프입니다. 이는 프로그램의 출력(또는 입력)을 파일이나 다른 프로그램으로 보낼 수 있게 해줍니다. 이미 이 기능을 사용했지만 인식하지 못했을 수도 있습니다. “ > ” 기호를 명령어에서 사용하거나 “ | ” 기호를 사용했을 때 각각 리디렉션이나 파이프를 사용한 것입니다.
모든 유닉스 계열 운영 체제, 예를 들어 리눅스와 FreeBSD에서, 명령어 줄 프로그램의 출력은 자동으로 표준 출력(stdout)이라고 알려진 장소로 전달됩니다. 기본적으로 표준 출력은 화면(콘솔)이지만, 파이프와 리디렉션을 사용하여 변경할 수 있습니다. 마찬가지로 키보드는 표준 입력(stdin)으로 간주되며, 표준 출력과 마찬가지로 변경할 수 있습니다.
파이프
파이프는 한 명령어의 출력을 다른 명령어에 입력으로 사용하도록 전달할 수 있게 해줍니다. 다시 말해, 하나의 프로그램의 표준 출력이 다른 프로그램의 표준 입력이 되는 것입니다.
“ more ” 명령어는 표준 입력을 받아서 표준 출력(화면)에서 페이지 단위로 표시합니다. 이는 어떤 명령어가 한 화면에 표시할 수 있는 것보다 더 많은 정보를 표시할 경우, “ more ” 프로그램이 첫 번째 화면이 가득 찬 후 일시 중지하고 사용자가 SPACE를 눌러 다음 페이지를 보거나 RETURN을 눌러 다음 줄을 보기까지 대기함을 의미합니다.
다음은 /dev 디렉토리에서 모든 파일을 목록화하고( -la) 출력을 more로 파이핑하는 예시입니다. /dev 디렉토리에는 수십 개의 파일이 있어 more가 페이지 단위로 표시해야 합니다.
ls -la /dev | more
화면 하단의 --More-- 프롬프트에 주목하세요. 다음 페이지를 보려면 SPACE를 누르고, 출력이 끝날 때까지 계속 SPACE를 누릅니다.
이번에는 “ wc ”(단어 수) 도구를 사용한 또 다른 파이프 예시입니다.
ls -1 /dev | wcwc는 표준 입력에서 줄 수, 단어 수 및 문자 수를 계산합니다. -l 매개변수를 사용하면 줄 수만 표시하므로, 디렉토리에 얼마나 많은 파일이 있는지 확인하는 좋은 방법입니다!
리눅스의 아카이빙 및 압축 명령어에 대한 심층적인 튜토리얼에는 tar와 7-Zip을 함께 사용하는 예제가 있습니다:
tar cvf - * | 7zr a -si somefiles.tar.7z이 경우 f 옵션 뒤의 하이픈은 tar에게 출력을 파일이 아닌 표준 출력으로 보내도록 지시합니다. tar의 출력은 7zr로 파이프를 통해 공급되며, 이는 -si 옵션 덕분에 표준 입력에서 입력을 기다리고 있습니다.
리디렉션
리디렉션은 파이프와 유사하지만 다른 프로그램이 아닌 파일을 사용합니다. 프로그램의 표준 출력은 화면입니다. >(greater than) 기호를 사용하여 프로그램의 출력을 파일로 보낼 수 있습니다. 다시 /dev 디렉토리의 목록을 보여주지만 이번에는 listing.txt라는 파일로 리디렉션합니다.
ls -la > listing.txt모든 것이 파일로 전송되었기 때문에 터미널에 표시되는 내용은 없습니다. cat 명령어를 사용하여 파일을 확인하거나( 이는 more와 파이핑할 수 있습니다) 편리하게는 more 명령어를 단독으로 사용할 수 있습니다:
more listing.txtlisting.txt가 이미 존재한다면 덮어씌워질 것입니다. 하지만 >>를 사용하여 기존 파일에 추가할 수 있습니다:
ls -la /home > listing.txt
ls -la /dev >> listing.txt첫 번째 리디렉션은 listing.txt 파일을 덮어쓰고, 두 번째는 파일에 추가합니다.
cat 명령어는 리디렉션을 사용하여 파일을 생성하는 데 사용할 수 있습니다. 예를 들어:
cat > atextfile.txt이제 입력하는 모든 텍스트는 Control-D 키를 누를 때까지 atextfile.txt 파일로 전송됩니다. 해당 시점에서 파일이 닫히고 명령 프롬프트로 돌아옵니다. 파일에 추가 텍스트를 추가하려면 같은 명령어를 사용하되 두 개의 greater than 기호( >>)를 사용합니다.
결론
리눅스 명령어 줄 프로그램의 많은 부분이 리디렉션과 파이프와 함께 작동하도록 설계되었습니다. 이를 실험해 보고 어떻게 상호작용하는지 확인해 보세요. 예를 들어, 현재 프로세스를 나열하는 ps 명령어의 출력은 grep으로 파이프를 통해 전달될 수 있습니다. 루트가 소유한 프로세스를 나열하는 방법을 알아보세요.