반응형
Linux 입출력
리눅스를 명령어를 보다보면 2>&1
, 2>&1 &
, 2>/dev/null
등의 명령어를 본 적이 있을 것이다. 이것은 리눅스의 IO Redirection 방식으로 표준 스트림의 흐름을 변경해가며 사용하는 것이다. 지금부터 천천히 살펴보자.
IO Redirection은 말 그래도 Input Ouput Redirection이다. 리눅스에서의 모든 프로세스는 stdin, stdout, stderr 총 세 가지의 데이터 스트림을 갖고 있으며 각각 0, 1, 2로 표현하고 파일 디스크립터라고 불리운다.(주로 쉘에서 사용) 프로세스는 ls, mkdir, rm 등 리눅스의 모든 명령어를 의미한다.
- stdin - standard input (0) : 입력
- stdout - standard output (1) : 정상 결과 출력
- stderr - standard error (2) : 오류 내용 출력 (출력은 동일하나, 정상 출력과 오류출력을 구분)
- args, argv - command-line arguments : ls -al의 al 처럼 프로세스 뒤에 -를 통해 오는 인자들로 입력에 속함
Linux Redirection
파일 디스크립터 (0,1,2)와 Redirection (>, >>, <, <<) 기호를 사용하여 입출력 동작을 자유롭게 변경하여 사용할 수 있다.
>
: 결과를 파일로 저장 (덮어쓰기)>>
: 결과를 파일로 저장 (덮어쓰지 않고 기존 파일에 추가)<
: 입력(파일, 텍스트 등)을 명령어에 실행 (덮어쓰기)<<
: 입력을 명령어에 실행 (덮어쓰지 않고 기존 파일에 추가)
리눅스에서 default stdout은 터미널 즉 모니터이다. 따라서 현재 명령어를 실행하면 결과 값을 터미널에서 확인할 수 있다.
// 터미널에 결과 있음
ls -al
- 현재 경로에 존재하는 리스트들을 터미널에 출력 (stdout)
// 터미널에 결과 없음
ls -al > dummy.t
ls -al 1> dummy2.t
- 현재 경로에 존재하는 리스트들을 dummy.t, dummy2.t 라는 파일에 저장
- Redirection
>
와 파일 디스크립터 1로 지정해서 명령어의 실행 결과를 파일로 저장하도록 지정했다. > 하나만 사용했을 경우 기본 값인 1> (stdout)과 결과가 동일하다.
// 존재하지 않는 파일을 tail을 통해 dummy3.t 파일에 저장 시도 (No such file or directory 발생)
tail -100f notFoundFile.t > dummy3.t
// 존재하지 않는 파일을 tail을 통해 실행하여 발생한 오류를 dummy3.t 파일에 저장 (오류 내용이 파일에 저장)
tail -100f notFoundFile.t 2> dummy3.t
cat dummy3.t
- 2> 를 사용하면 발생한 Redirection을 stderr로 변경하여 결과 값을 사용할 수 있다.
head -n1 < dummy3.t > dummy4.t
- 다음과 같이 stdin과 stdout을 모두 사용한 경우를 보자. dummy3.t의 내용을 Rediraction으로 stdin 형식으로 입력으로 받아 1번째 라인만 가져오고, 다시 Redirection으로 stdout 형식으로 해당 결과를 dummy4.t에 저장하는 방식이다.
grep -i "java" ./* 1> /dev/null
- 현재 경로에서 문자열을 검색하고, stdout(정상) 출력에 해당하는 값은 /dev/null로 보낸다. 리눅스에서 /dev 디렉토리는 하드웨어 장치와 연관된 특수 파일이 존재하는 디렉토리로 /dev/null 공간에 전송된 모든 데이터는 버려진다.
# & 다음에 파일 디스크립터가 오는 것을 명시
grep -i "java" ./* > /dev/null 2>&1
# 두 번째 &은 백그라운드에서 실행하라는 의미 (모든 출력을 /dev/null에 버리고 백그라운드에서 구동)
java -jar spring.jar > /dev/null 2>&1 &
- 2>&1 에서 &은 다음에 파일 디스크립터가 오는 것을 알려주는 역할을 한다. 따라서 표준 에러를 다음에올 파일디스크립터로 변경해서 사용하겠다는 의미가 된다. (표준 에러를 표준 출력으로 사용하겠다는 의미가 됨)
- 반대로 1>&2라면 표준 출력을 표준 에러로 사용하겠다는 명시가 된다. 마지막에 & 혼자 쓰이는 경우 백그라운드 즉, 데몬 실행으로 사용할 때 쓰인다.
# [명령어] > [파일1] > [파일2]
grep -i "dummy" ./* 2> error.t 1> success.t
- 표준 출력과 에러 출력을 별도의 파일로 분리하는 방법이다.
# << ! 사용으로 멀티라인 입력 ! 대신 아무 문자 사용가능
cat << !
asd
asd
!
# sqlplus를 사용하여 SQL문 결과를 파일로 저장
sqlplus SCOTT/TIGER << !
spool result.t
SELECT
*
FROM
DUAL
;
spool off
exit
!
- << 다음에 문자를 사용하여 멀티라인 입력이 가능하다. 다음에 나올 문자는 아무 문자나 사용해도 상관 없으며, 마지막에 동일한 문자를 입력하면 종료된다. 쉘을 통해 sql문을 실행하고 파일로 저장할 때 유용하게 쓰인다.
반응형