본문 바로가기

CentOS/Study

[Study31]Linux Bash 셸 기술로 생산성 향상 - 리다이렉션(Redirection)

반응형

방향 재지정 (Redirection)

파일 기술자(File Descriptor)는 각 프로세스를 위해 쉘에 의해 생성됩니다. 파일을 열면, 쉘이 해당 파일을 나타내는 특별한 숫자를 만들어 냅니다. 이것이 파일 기술자입니다. 파일 기술자는 파일을 열 때 할당되는 번호로, 각 파일에 대해 할당된 파일 기술자는 다릅니다. 파일 기술자는 프로세스의 열린 파일을 구분할 때 사용되는 식별 번호입니다.

파일 기술자는 파일을 열 때 자동으로 할당되며, 이는 C 언어에서 파일을 다룰 때 유용하게 사용됩니다. 파일 기술자를 사용하여 프로세스에서 파일의 입출력 채널을 지정할 수 있습니다.

리다이렉션은 출력 채널을 다른 곳으로 변경하는 기술입니다. 일반적으로 출력은 모니터로 전송되지만 리다이렉션을 사용하면 파일이나 다른 출력 장치로 전송할 수 있습니다. 리다이렉션을 사용하면 표준 출력, 표준 에러, 파일 등을 지정할 수 있습니다.

예를 들어, 리다이렉션을 사용하여 표준 출력을 파일로 전송할 수 있습니다. 이때, 덮어쓰기 또는 이어쓰기 기능을 선택할 수 있습니다. 또한, 표준 에러는 표준 출력과 동일한 방법으로 리다이렉션할 수 있습니다.

파일 기술자를 사용하여 입출력 채널을 지정하고, 리다이렉션을 사용하여 출력 채널을 변경하는 것은 프로세스에서 입출력을 다룰 때 매우 유용합니다. 이를 통해 프로세스의 입출력을 쉽게 제어할 수 있습니다. 또한, 리다이렉션을 사용하여 프로세스의 출력을 다른 프로그램의 입력으로 전달할 수도 있습니다. 이를 통해 프로그램 간의 통신이 가능해집니다.

 

예약 되어진 파일 기술자(File Descriptor)

파일기술자 축약의미 설명

0 stdin Standard Input, 표준 입력. 키보드에서 입력을 받습니다.
1 stdout Standard Output, 표준 출력. 정상적인 출력 결과를 모니터로 출력합니다.
2 stderr Standard Error, 표준 에러. 에러의 출력 결과를 모니터로 출력합니다.

파일 기술자는 컴퓨터 시스템에서 파일 및 기타 입출력(I/O) 장치에 대한 엑세스를 제공하는 데 중요한 역할을 합니다. 이를 통해 프로세스는 파일을 열어서 읽고 쓸 수 있으며, 이를 통해 데이터를 저장하고 처리할 수 있습니다.

파일 기술자 정보는 /proc 디렉토리 하위에 존재하는 각 프로세스의 PID(Process ID) 번호 디렉토리 하위의 fd 디렉토리에서 확인할 수 있습니다. 또한, /dev/fd 디렉토리 하위에서도 파일 기술자의 번호를 확인할 수 있습니다. 파일 기술자는 일반적으로 0부터 시작하며, 0번 파일 기술자는 표준 입력을 가리킵니다. 1번 파일 기술자는 표준 출력이고, 2번 파일 기술자는 표준 에러를 가리킵니다.

하지만 이러한 번호들은 열어볼 수 없는 파일을 가리키고 있습니다. 이러한 파일 기술자를 확인하기 위해서는 테스트를 수행해야 합니다. 예를 들어, 가상 터미널 1에서 /etc/passwd 파일을 열고 다른 가상 터미널 2에서 현재 실행 중인 프로세스를 확인한 후 프로세스가 열고 있는 파일을 확인해 보면 새로운 파일 기술자(File Descriptor)가 생성된 것을 확인할 수 있습니다. 이러한 방식으로 파일 기술자를 확인하면 보다 정확한 분석이 가능합니다.

출력 리다이렉션(Redirection)은 프로그램이 표준 출력을 터미널이 아닌 다른 파일로 보내는 것을 의미합니다. 이를 통해 프로그램의 출력 내용을 파일에 저장하거나, 다른 프로그램으로 보낼 수 있습니다. 출력 리다이렉션 연산자를 사용하여 표준 출력을 파일로 리다이렉션할 수 있습니다. 이때 > 연산자는 파일을 덮어쓰고, >> 연산자는 파일 끝에 내용을 추가합니다.

에러 리다이렉션(Redirection stderr)은 프로그램이 표준 에러 출력을 터미널이 아닌 다른 파일로 보내는 것을 의미합니다. 이를 통해 프로그램의 에러 내용을 파일에 저장하거나, 다른 프로그램으로 보낼 수 있습니다. 에러 리다이렉션 연산자를 사용하여 표준 에러 출력을 파일로 리다이렉션할 수 있습니다. 이때 2> 연산자는 파일을 덮어쓰고, 2>> 연산자는 파일 끝에 내용을 추가합니다.

이러한 출력 및 에러 리다이렉션은 프로그램 디버깅 및 로깅, 시스템 관리 등 다양한 분야에서 유용하게 사용됩니다. 따라서 파일 기술자 및 리다이렉션에 대한 이해는 컴퓨터 시스템과 관련된 작업을 수행하는 데 필수적입니다.

파일 기술자에 대한 추가 정보로는, 파일 기술자를 열어 놓은 프로세스가 종료되면 해당 파일 기술자는 자동으로 닫히게 됩니다. 또한, 파일 디스크립터를 복사하여 다른 프로세스에서 사용할 수도 있습니다. 이러한 방식으로 파일 기술자를 공유함으로써 프로세스 간 통신을 구현할 수 있습니다.

또한, 프로세스는 파일을 열 때 파일의 상대 경로나 절대 경로를 사용할 수 있습니다. 상대 경로는 현재 작업 디렉토리를 기준으로 한 경로를 의미하며, 절대 경로는 루트 디렉토리를 기준으로 한 경로를 의미합니다. 따라서 프로세스가 파일을 열 때 경로를 정확히 지정해야 합니다.

마지막으로, 파일 기술자와 관련하여 유의해야 할 점으로는, 파일 기술자는 파일이 아니라 파일에 대한 참조입니다. 즉, 파일 기술자는 파일의 내용을 직접 저장하고 있지 않습니다. 따라서 여러 개의 파일 기술자가 하나의 파일을 참조할 수도 있습니다. 이러한 파일 기술자의 특성을 이해하면 파일 시스템을 더욱 효율적으로 활용할 수 있습니다.

 

File Descriptor 확인

파일 디스크립터 확인을 위해서는, 파일 이름, 위치 및 해당 메타데이터를 모두 포함해야 합니다. 또한, 파일의 내용을 검토하고 파일 디스크립터의 목적과 일치하는지 확인하는 것이 도움이 될 수 있습니다. 파일 디스크립터를 철저하게 검토하고 분석하는 것은 잠재적인 오류나 문제를 미리 방지하는 데 도움이 될 수 있습니다.

[TERM1]

# vi /etc/passwd

vi 명령어는 리눅스에서 파일을 편집하는 데 사용됩니다. 이 명령어는 /etc/passwd 파일을 vi 에디터에서 엽니다.

[TERM2]

# ps -ef | grep vi    /* vi가 실행된 PID번호를 볼 수 있다 */
root      2077  2045  0 02:26 pts/10   00:00:00 vi /etc/passwd
root      2081 32326  0 02:26 pts/8    00:00:00 grep vi
# cd /proc/2077/fd/* 단, 프로세스의 번호(2077)은 시스템마다 다를 수 있다. */
# ls -l/* 파일 기술자 4번이 할당되어 열린 것을 확인 할 수 있다. */
합계 0
lrwx------ 1 root root 64  3월 17 02:27 0 -> /dev/pts/10
lrwx------ 1 root root 64  3월 17 02:27 1 -> /dev/pts/10
lrwx------ 1 root root 64  3월 17 02:26 2 -> /dev/pts/10
lrwx------ 1 root root 64  3월 17 02:27 4 -> /etc/.passwd.swp
# cd

ps 명령어는 현재 실행 중인 프로세스 목록을 나열하는 데 사용됩니다. grep 명령어는 현재 실행 중인 프로세스 목록에서 특정 프로세스를 검색하는 데 사용됩니다. 이 경우 vi 프로세스를 검색합니다. 출력에는 vi 프로세스의 프로세스 ID(PID)인 2077이 표시됩니다.

cd 명령어는 현재 작업 디렉토리를 변경하는 데 사용됩니다. 이 경우, vi 프로세스에서 사용되는 파일 디스크립터에 대한 정보가 포함된 /proc/2077/fd/ 디렉토리로 변경합니다. ls 명령어는 현재 디렉토리의 파일을 나열하며, 파일 기술자 4가 열려 있고 /etc/.passwd.swp를 가리키고 있음을 보여줍니다.

[TERM1]

# vi /etc/passwd/* vi 편집기 실행 닫기 */
:q

이 명령어는 이전 단계에서 열었던 vi 편집기를 닫습니다.

[TERM2]

# cd /proc/2077/fd/* 실행중인 vi 편집기의 프로세스 번호 */
-bash: cd: /proc/2077/fd: 그런 파일이나 디렉토리가 없음

이 명령어는 다시 디렉토리를 /proc/2077/fd/로 변경하지만, 이번에는 vi 프로세스가 실행되지 않았기 때문에 실패합니다.

요약하자면, 이러한 명령어는 파일을 편집하는 vi 에디터 사용 방법, 현재 실행 중인 프로세스의 프로세스 ID를 찾는 ps 명령어 사용 방법, 그리고 프로세스에서 사용되는 파일 디스크립터를 탐색하기 위한 cd 및 ls 명령어 사용 방법을 보여줍니다.

 

proc 디렉토리에 프로세스 번호 생성여부 확인

프로세스 번호가 proc 디렉토리에 생성되었는지 확인하려면 다음 단계를 따르십시오:

  1. 터미널 창을 엽니다.
  2. "ls /proc"을(를) 입력하여 디렉토리의 내용을 확인합니다.
  3. 찾고자 하는 프로세스 번호의 이름을 가진 폴더를 찾습니다.
  4. 폴더가 존재하면, 프로세스가 생성되었습니다.
  5. 폴더가 존재하지 않으면, 프로세스가 아직 생성되지 않았습니다.

모든 필요한 프로세스가 생성되어 정상적으로 작동하는지 확인하기 위해 정기적으로 proc 디렉토리를 확인하는 것이 중요합니다.

[TERM2]

시스템에서 실행 중인 프로세스 목록을 추출하려면, /proc 디렉토리로 이동한 다음 다음 명령어를 실행하십시오.

# cd /proc
# ps -ef > /test/proc_`date +%H%M`.txt

[TERM1]

사용자 정보를 편집하려면, 다음 명령어를 사용하여 /etc/passwd 파일을 열어야 합니다.

# vi /etc/passwd

[TERM2]

vi의 프로세스 ID를 찾으려면 다음 명령어를 실행하십시오.

# cd /proc
# ps -ef | grep vi
root     12926  8360  0 16:26 pts/4    00:00:00 vi /etc/passwd
root     12928 12761  0 16:26 pts/1    00:00:00 grep vi

vi의 프로세스 ID가 proc 디렉토리에 나열되어 있는지 확인하려면 다음 명령어를 실행하십시오.

# grep 12926 /test/proc_`date +%H%M`.txt
출력값 없음
# ls > /test/proc_`date +%H%M`.txt
# ls /test
proc_1415.txt proc_1418.txt
# grep 12926 /test/proc_1418.txt
12926

[TERM1]

vi 편집을 완료하고 빠져나오려면 다음 키를 누르십시오.

:q

[TERM2]

/test 디렉토리에 새 파일을 생성하고 성공적으로 생성되었는지 확인하려면 다음 명령어를 실행하십시오.

# ls > /test/proc_`date +%H%M`.txt
# ls /test
proc_1415.txt proc_1418.txt proc_1422.txt
# grep 12926 /test/proc_1422.txt
출력값 없음

 

표준 입력, 표준 출력

쉘에서는 명령어 입력을 특별한 지정이 없는 한 키보드에서 받습니다. 명령어가 수행되면 결과가 즉시 모니터에 출력됩니다. 그러나 사용자는 리다이렉션 심볼(Redirection Symbol)을 사용하여 입/출력 방향을 변경하여 다른 파일에 출력하거나 파일에서 읽어 들일 수 있습니다.

리다이렉션 심볼을 사용하지 않으면 다음과 같은 흐름으로 작동합니다.

표준입력(0, stdin) -----> SHELL(bash) -----> 표준출력(1, stdout)
(EX: keyboard)              |               (EX: Screen)
												    |
												    V
										      표준에러(2, stderr)
										      (EX: Screen)

하지만, 리다이렉션 심볼을 사용하여 위의 흐름을 다른 방향으로 변경할 수 있습니다. 출력 결과를 모니터가 아닌 파일로 저장할 수 있습니다.

1. 표준 입력(stdin) 예제

# cat
hello<Enter>       /* 표준 입력(stdin) */
hello                /* 표준 출력(stdout) */
Linux<Enter>
Linux
<Ctrl + D>

위의 예시에서는 "cat" 명령어를 사용하여 "hello"와 "Linux"를 입력하고 "Ctrl + D"를 눌러 종료하면 "hello"와 "Linux"가 출력됩니다. 이때, "Ctrl + D"는 표준 입력을 종료하는 단축키입니다.

2. 표준 출력(stdout) 예제

# ls -l /var

위의 예시에서는 "ls -l /var" 명령어를 사용하여 "/var" 디렉토리의 파일 목록을 출력합니다. 이때, 출력 결과는 표준 출력으로 모니터에 출력됩니다.

3. 리다이렉션 심볼(>)을 사용한 파일 출력 예제

# ls -l > lsfile     (# ls -l 1> lsfile)
# cat lsfile

위의 예시에서는 "ls -l" 명령어를 사용하여 해당 디렉토리의 파일 목록을 출력하고, ">"를 사용하여 출력 결과를 "lsfile"이라는 파일에 저장하였습니다. 이후 "cat lsfile" 명령어를 사용하여 "lsfile"의 내용을 출력하였습니다. ">"는 표준 출력을 파일에 저장하는 리다이렉션 심볼입니다.

4. 파일 입력(stdin) 예제

# cat  <  /etc/passwd

위의 예시에서는 "/etc/passwd" 파일을 "cat" 명령어를 사용하여 출력합니다. 이때, "<"를 사용하여 "/etc/passwd" 파일을 표준 입력으로 사용합니다.

5. 리다이렉션 심볼(<)을 사용한 파일 입력 예제

# cat  <  testfile

위의 예시에서는 "testfile" 파일을 "cat" 명령어를 사용하여 출력합니다. 이때, "<"를 사용하여 "testfile" 파일을 표준 입력으로 사용합니다.

6. 리다이렉션 심볼(2>)을 사용한 표준 에러 출력 방향 변경 예제

# ls -l /test /nodir 2> dirfilename2

위의 예시에서는 "ls -l /test /nodir" 명령어를 사용하여 "/test"와 "/nodir" 디렉토리의 파일 목록을 출력하였습니다. "/nodir" 디렉토리는 존재하지 않기 때문에 에러 출력이 발생합니다. 이때, "2>"를 사용하여 표준 에러 출력 방향을 변경하여 출력 결과를 "dirfilename2"이라는 파일에 저장하였습니다. "2>"는 표준 에러 출력 방향을 파일로 재지정하는 리다이렉션 심볼입니다.

 

입력 재지정(입력 리다이렉션, Redirection stdin)

입력 재지정은 표준입력(Stdin)에서 입력을 받지 않고, 다른 곳에서 입력을 받는 것을 입력 재지정(Redirection stdin)이라고 합니다. 이를 통해 파일로부터 입력을 받을 수 있어 대용량 파일 처리 등에 유용합니다. 파일 기술자 0번은 생략 가능합니다.

[형식]
CMD   <  filename (표준입력)
CMD  **0**<  filename(표준입력 - 파일 기술자 0번)

입력 재지정은 다양한 상황에서 활용될 수 있습니다. 예를 들어, 대용량 파일 처리를 위해 파일로부터 입력을 받거나, 입력 데이터가 필요한 프로그램을 자동으로 실행할 때 사용될 수 있습니다. 또한, 프로그램 실행 시 자동으로 실행되는 스크립트 파일을 이용해 입력 데이터를 전달할 수 있습니다. 이러한 기능들은 매우 편리하며, 여러 가지 상황에서 유용하게 사용될 수 있습니다.

또한, 입력 재지정은 출력을 파일이나 네트워크 소켓에 리디렉션하거나, 다른 소스에서 데이터를 처리하거나 분석하는 경우에도 사용할 수 있습니다. 이는 데이터를 다양한 출처에서 처리하거나 분석해야 하는 상황이나 데이터를 여러 대상에게 전송해야 하는 상황에서 유용합니다. 또한, 명령줄 매개변수와 결합하여 프로그램이나 스크립트에 추가 정보를 제공하여 더 큰 유연성과 제어력을 갖게 할 수도 있습니다.

 

리다이렉션 실습

1. Standard Input을 파일로 리다이렉션

# cat < /etc/passwd

cat 명령어는 파일 내용을 출력하는 데 사용됩니다. 이 명령어는 /etc/passwd 파일을 리다이렉션하여 파일 내용을 출력합니다.

2. 파일로부터 Standard Input을 리다이렉션

# cat 0< /etc/shadow

cat 명령어를 사용하여 /etc/shadow 파일을 읽고 파일 내용을 출력합니다. 이때, 0<를 사용하여 Standard Input을 리다이렉션합니다.

3. 메일 보내기

# mail user01
Subject: Test Mail
Hello Linux
CentOS 5.4 User
Cc: <ENTER>

mail 명령어는 메일을 보내는 데 사용됩니다. 이 명령어를 사용하여 user01에게 메일을 보냅니다. 이때, Subject를 입력하고 본문을 작성합니다. 그리고 Cc로 참조 메일 주소를 입력할 수 있습니다. 메일 본문 작성이 끝나면 <ENTER>를 입력하여 종료합니다.

# su - user01
$ mail
> #            (# is number)
> q
$ exit

su 명령어를 사용하여 user01 계정으로 전환합니다. 그리고 mail 명령어를 사용하여 메일함을 엽니다. 메일함에서는 # 뒤에 있는 숫자로 메일을 선택할 수 있습니다. 이때, q를 입력하여 메일함을 종료합니다.

4. 파일로부터 메일 보내기

# mail -s "Test Mail" user01 < /etc/hosts
# mail -s "linuxXXX : OK" admin@paran.com < report.txt

mail 명령어를 사용하여 /etc/hosts 파일을 읽고 이를 user01에게 메일로 보냅니다. 이때, -s 옵션으로 메일 제목을 입력할 수 있습니다. 또한, admin@paran.com에게 report.txt 파일을 메일로 보냅니다.

5. Wall 명령어

# wall
"System Migration Works with /dev/sda1"
<CTRL + D>
# wall < /etc/hosts

wall 명령어는 모든 사용자에게 메시지를 보내는 데 사용됩니다. 이 명령어를 사용하여 메시지를 작성하고 <CTRL + D>를 입력하여 메시지를 종료합니다. 또한, /etc/hosts 파일을 읽고 이를 모든 사용자에게 메시지로 보냅니다.

 

출력 재지정(출력 리다이렉션, Redirection stdout)

출력 재지정(Redirection stdout)은 표준출력(모니터)으로 출력하는 것이 아니라 다른 쪽으로 출력하는 것을 말합니다. 기본적으로 명령어를 실행하면 모니터로 출력되지만, 출력을 다른 쪽 방향으로 바꾸어 저장할 수 있습니다. 이를 위해서는 파일 기술자 1번을 지정해야 합니다.

출력 재지정의 명령어 형식은 다음과 같습니다.

CMD   >  filename /* 표준출력, 덮어쓰기 기능 */
CMD  **1**>  filename /* 표준출력, 덮어쓰기 기능 */
CMD   >> filename/* 표준출력, 이어쓰기 기능 */
CMD  **1**>> filename/* 표준출력, 이어쓰기 기능 */

즉, 출력 재지정을 사용하면 명령어의 출력 결과를 파일로 저장하여 나중에 필요할 때 사용할 수 있습니다. 출력 재지정은 리눅스 시스템에서 매우 유용하게 사용됩니다.

 

리다이렉션(Redirection stdout) 실습

# cd
# ls -l

cd 명령어는 홈 디렉토리로 이동합니다. ls -l 명령어는 현재 디렉토리의 파일과 디렉토리 정보를 자세히 출력합니다.

drwxr-xr-x 2 root root  4096  3월 15 15:55 Desktop
-rw------- 1 root root  4210  1월 25 22:54 anaconda-ks.cfg
-rw-r--r-- 1 root root 54631  1월 25 22:54 install.log
-rw-r--r-- 1 root root  9641  1월 25 22:50 install.log.syslog

ls -l 명령어 결과를 출력합니다.

# ls -l > lsfile

> 연산자는 표준 출력을 파일로 리다이렉션합니다. ls -l 명령어의 결과를 lsfile 파일에 덮어씁니다.

# cat lsfile
drwxr-xr-x 2 root root  4096  3월 15 15:55 Desktop
-rw------- 1 root root  4210  1월 25 22:54 anaconda-ks.cfg
-rw-r--r-- 1 root root 54631  1월 25 22:54 install.log
-rw-r--r-- 1 root root  9641  1월 25 22:50 install.log.syslog
-rw-r--r-- 1 root root     0  3월 17 02:32 lsfile

cat 명령어는 파일의 내용을 출력합니다. lsfile 파일의 내용을 출력합니다.

리다이렉션을 사용하면 프로그램의 출력 결과를 파일로 저장할 수 있습니다. 이를 통해 프로그램의 출력 내용을 보관하거나, 다른 프로그램으로 전달할 수 있습니다. 출력 리다이렉션 연산자인 >는 파일을 덮어쓰고, >> 연산자는 파일 끝에 내용을 추가합니다.

 

> , >> 차이점

echo 1111 : "1111"을 출력합니다.

# echo 1111
1111

echo 1111 > filename1 : "1111"을 filename1 파일에 덮어씁니다. filename1 파일이 없으면 새로 생성됩니다.

# echo 1111 > filename1`cat filename1` : filename1 파일의 내용을 출력합니다. 출력 결과는 "1111"입니다.
# cat filename1
1111

echo 2222 > filename1 : "2222"를 filename1 파일에 덮어씁니다. filename1 파일이 이미 존재하므로 "1111" 대신 "2222"가 들어갑니다.

# echo 2222 > filename1 /* 덮어쓰기 기능 */

cat filename1 : filename1 파일의 내용을 출력합니다. 출력 결과는 "2222"입니다.

# cat filename1
2222

echo 1111 >> filename1 : "1111"을 filename1 파일의 끝에 이어서 씁니다.

# echo 1111 >> filename1 /* 이어쓰기 기능 */

cat filename1 : filename1 파일의 내용을 출력합니다. 출력 결과는 "2222"와 "1111"이 이어져 있는 것입니다.

# cat filename1
2222
1111

 

에러 재지정(에러 리다이렉션, Redirection stderr)

에러 재지정(Redirection stderr)은 표준 에러로 출력하는 대신 다른 곳으로 출력하는 것을 말합니다. 기본적으로는 모니터로 출력되지만, 다른 위치로 출력할 수 있습니다. 파일 기술자 2번은 생략할 수 없습니다. 1번 파일 기술자와 구별하기 위해 방향 재지정자를 1번과 동일하게 사용하여 생략할 수 없습니다.

명령어 형식:

CMD  **2**>  filename/* 표준에러출력 */
CMD  **2**>> filename /* 표준에러출력 */

에러 재지정은 명령어에서 발생할 수 있는 오류를 디버깅 할 때 유용합니다. 이 기능은 명령어를 더욱 유연하게 사용할 수 있도록 도와줍니다. 때로는 오류 메시지가 필요하지 않을 때도 있기 때문에, 에러 재지정은 명령어를 더욱 유용하게 만들어줍니다. 이러한 기능을 사용하여 명령어를 더욱 효율적으로 활용해보세요.

 

표준 에러 실습

[TERM1]

# vi /etc/passwd

vi 명령어는 리눅스에서 파일을 편집하는 데 사용됩니다. 이 명령어는 /etc/passwd 파일을 vi 에디터에서 엽니다.

[TERM2]

# ps -ef | grep vi    /* vi가 실행된 PID번호를 볼 수 있다 */
root      2077  2045  0 02:26 pts/10   00:00:00 vi /etc/passwd
root      2081 32326  0 02:26 pts/8    00:00

ps 명령어는 현재 실행 중인 프로세스 목록을 보여줍니다. 여기서는 grep 명령어를 사용하여 vi 명령어가 실행된 PID 번호를 찾았습니다.

# ls -l /test /nodir
--------------------------------------
정상출력
에러출력
--------------------------------------

ls 명령어는 현재 디렉토리의 파일 목록을 보여줍니다. /test와 /nodir 두 개의 디렉토리를 보려고 시도합니다. /test는 정상적으로 출력되었지만, /nodir는 존재하지 않으므로 에러가 발생합니다.

# ls -l /test /nodir > dirfilename1
--------------------------------------
정상출력
에러출력
--------------------------------------
# cat dirfilename1
-rw-r--r--  1 root root    0  3월 17 02:34 dirfilename1
-rw-r--r--  1 root root    0  3월 17 02:33 file1
-rw-r--r--  1 root root    0  3월 17 02:33 file2
-rw-r--r--  1 root root    0  3월 17 02:33 file3

> 연산자는 출력을 파일로 리다이렉션합니다. dirfilename1 파일에 /test와 /nodir의 출력 결과가 저장되었습니다. /test는 정상적으로 출력되었지만, /nodir는 출력 대신 에러 출력이 파일에 저장되었습니다.

# ls -l /test /nodir 2> dirfilename2
--------------------------------------
정상출력
에러출력
--------------------------------------
# cat dirfilename2
ls: /nodir: 그런 파일이나 디렉토리가 없음

2> 연산자는 표준 에러 출력을 파일로 리다이렉션합니다. dirfilename2 파일에 /test와 /nodir의 에러 출력이 저장되었습니다. /test는 정상적으로 출력되었지만, /nodir는 에러 출력이 파일에 저장되었습니다.

# ls /test /nodir > dirfilename1 2> dirfilename2
--------------------------------------
정상출력
에러출력
--------------------------------------

# cat dirfilename1
# cat dirfilename2

>와 2> 연산자를 함께 사용하여 출력과 에러 출력을 모두 파일로 리다이렉션합니다. dirfilename1 파일에는 /test와 /nodir의 정상 출력이 저장되었고, dirfilename2 파일에는 /nodir의 에러 출력이 저장되었습니다.

# ls /test /nodir > dirfilename 2>&1
# cat dirfilename

2>&1 연산자는 표준 에러 출력을 표준 출력으로 리다이렉션합니다. dirfilename 파일에는 /test와 /nodir의 출력 결과가 모두 저장되었습니다. /test는 정상적으로 출력되었고, /nodir는 에러 출력이 표준 출력으로 리다이렉션되어 정상 출력으로 처리되었습니다.

(실무 예) script.sh(스크립트)를 사용하여 로그 파일을 생성하는 것은 매우 유용합니다.

스크립트는 많은 작업을 자동화하고 시간을 절약할 수 있도록 해주며, 로그 파일을 생성하여 작업을 추적하고 문제를 해결하는 데 도움이 됩니다.

여기서는 명령어를 사용하여 로그 파일을 생성하는 두 가지 방법을 살펴보겠습니다. 처음에는 스크립트를 실행하고 출력을 파일에 저장하는 방법을 사용했지만, 이 방법은 출력이 오류인 경우 문제가 발생할 수 있습니다. 대신 출력과 오류 모두를 파일에 저장하기 위해 두 번째 방법을 사용하는 것이 좋습니다.

(1) # ./script.sh > file.log
(2) # ./script.sh > file.log 2>&1

두 번째 방법 (2)를 사용하면 출력과 오류를 동일한 파일 (file.log)에 모두 저장할 수 있습니다. 이렇게 하면 출력과 오류 모두가 로그 파일에 기록되므로 작업 추적과 문제 해결이 더욱 쉬워집니다. 또한, 이 방법을 사용하여 로그 파일에 시간별로 쉽게 정리할 수 있습니다.

따라서, 스크립트를 사용하여 작업을 자동화하고 로그 파일을 생성하여 작업 추적과 문제 해결을 돕는 것이 좋습니다. 또한, 출력과 오류 모두를 파일에 저장하기 위해 두 번째 방법을 사용하는 것이 좋습니다.

(실무 예) ./configure —prefix=/usr/local/apache2

아파치 웹 서버를 설치하기 전에 구성을 제어하는 명령어입니다. 아파치 웹 서버는 오픈 소스로 제공되며, 구성을 변경하기 위한 다양한 옵션이 있습니다. 이 명령어를 사용하여 아파치 웹 서버의 설치 경로를 /usr/local/apache2로 설정할 수 있습니다.

그러나 이 명령어는 파일 로깅에 대한 정보가 없습니다. 이 경우, 에러 메시지를 파일에 기록하려면 표준 에러 출력을 표준 출력으로 전환하고 표준 출력을 파일에 리디렉션해야 합니다.

# ./configure --perfix=/usr/local/apache2 2> file.log
# ./configure --perfix=/usr/local/apache2 > file.log 2>&1

위의 두 명령어는 configure 명령어 출력의 표준 에러를 file.log 파일에 저장합니다. 첫 번째 명령어는 표준 에러 출력을 파일에 리디렉션하고, 두 번째 명령어는 표준 출력을 파일에 리디렉션하고, 표준 에러 출력을 표준 출력으로 리디렉션합니다.

이렇게 함으로써, configure 명령어의 출력과 에러 모두를 파일에 저장할 수 있으므로, 추후에 작업 추적 및 문제 해결에 유용합니다.

 

일반 사용자(EX: oracle, wasuser)가 검색

일반 사용자들은 종종 파일이나 디렉토리를 찾아야 할 때가 있습니다. 이때, 파일 시스템 전체를 검색하는 것은 매우 시간이 오래 걸리며, 원하는 파일을 찾을 확률도 낮습니다. 이를 방지하기 위해 다음 명령어를 사용할 수 있습니다.

$ find / -name core –type f
$ find / -name core –type f **2**> /dev/null

첫 번째 명령은 모든 파일 시스템에서 "core"라는 이름의 파일을 찾아냅니다. 하지만 불필요한 시스템 메시지가 화면에 출력되어 검색 결과를 찾기 어렵습니다. 이런 경우에는 두 번째 명령어를 사용하여 오류 메시지를 숨기고 출력을 /dev/null로 보내면 됩니다. 이렇게 하면 검색 결과가 표시되지 않고 불필요한 시스템 메시지가 표시되지 않습니다. 따라서, 일반 사용자들은 더욱 효율적으로 파일을 찾을 수 있습니다.

반응형