리다이렉션(Redirection)
파일 리스크립터 (File Discriptor, fd)
-리눅스의 일반 파일과 장치파일을 포함한 모든 파일을 관리하는 방식
-파일을 열거나 실행할때 혹은 명령어를 입력하면은 커널이 프로세스를 실행시켜 기본적으로 사용하는 장치들과 추가로 실행한 프로세스가 있다면 이정보를 파일디스크립터 테이블이라는 곳에 저장하는데, 이대 파일 디스크립터 테이블에 비어있는 0번부터 순차적으로 지정하고 가장 기본적으로 사용되는 장치에 대해서는 디스크립터 테이블에 미리 예약되어 있다.
-표준 입력장치 (키보드) fd/0 stdin
-표준 출력장치 (모니터) fd/1 stdout
-표준 에러장치 (모니터) fd/2 stderr
리다이렉션
-표준입력과 출력의 방향을 재지정하는 방법
명령어 입력 (키보드/표준입력) -> 명령어 결과 (모니터/표준출력)
출력 리다이렉션
- 화면에(표준출력)나오는 결과를 파일 내용으로 전달
#echo 'show me the money' 1> echo_test
fd번호 1은 생략 가 능
#cat > [파일명]
내용입력 후, 엔터 한번 치고
Ctrl + D ( 저장 )
# mkdir /practice/day4
# cd /practice/day4
# cp /etc/resolv.conf ./
# cat resolv.conf
ex) nameserver 8.8.8.8
#cat resolv.conf 1> redirection_test //표준입력 후 결과를 출력아닌 파일로 재지정
#cat > cat_test1 //표준입력은 1은 생략 가능
//기존 파일이 없다면 생성
cat_test!!!! [Enter] //개행 후
[Ctrl+d] //저장
#cat cat_test1 //cat_test1 내용 확인
cat_test!!!!
#cat > cat_test1 // 파일 내용입력 후 생성
cat_test???? //내용 입력 후 저장 (Ctrl +D)
#cat cat_test1 //기존에 있던 cat_test!!!! 없어지고
새롭게 썼던 cat_test???? 만 존재
즉, 파일의 내용을 덮어쓴다.
Bash 쉘에서 파일 덮어쓰기 방지하기 위한 설정
# set -o noclobber //덮어쓰기 방지 설정
#cat > cat_test1
-bash: cat_test1: cannot overwrite existing file (이런식으로 덮어쓰기를 방지한다.)
#set +o noclobber //덮어쓰기 방지 설정 해제
추가 리다이렉션
[명령어] >> [파일] - 기존 파일에 내용 추가
#ls > ls_test
#date > ls_test
#ls > ls_test
#date >> ls_test
#pwd >> ls_test
#cal >> ls_test
오류 리다이렉션
#ls error_test //오류메세지 발생
ls: cannot access error_test: 그런 파일이나 디렉터리가 없습니다
#ls error_test 1> err1
ls: cannot access error_test: 그런 파일이나 디렉터리가 없습니다
하지만 err1 파일은 만들어졌다. 그러나 안에 내용은 없다.
# ls error_test 2> err1 //표준 에러의 방향을 파일로 재지정
오류 출력메세지 x
# cat arr1
ls: cannot access error_test: 그런 파일이나 디렉터리가 없습니다
오류 메세지 출력하지 않기
/dev/null -리눅스 특수 파일로 파일의 내용을 지우거나, 오류메세지를 해당 파일로 리다이렉션하여 출력하지 않을 수 있다.
(윈도우 쓰레기통과 비슷)
# cat ls_test 1> /dev/null //출력결과를 null파일로 재지정
# cat ls_test 2> /dev/null //출력에러결과를 null파일로 재지정
#ls / 1> /dev/null //정상 결과 출력하지 않음
# ls / 2> /dev/null //에러 결과 출력 하지 않음
입력 리다이렉션
[명령어] < [파일]
#sort < /etc/passwd == sort /etc/passwd
#cat < /etc/passwd == cat /etc/passwd
#head -1 < /etc/passwd == head -1 /etc/passwd
#tail -2 < /etc/passwd == tail -2 /etc/passwd
tail <a.txt> b.txt
(1) a.txt 내용을 tail 명령어 입력 값으로 리다이렉션 (#tail a.txt)
(2) tail 명령어는 입력은 a.txt의 내용에서 마지막 10줄 출력
(3) tail 명령어의 출력결과를 b.txt파일에 리다이렉션
(4) 화면에 출력이아닌 b.tx t파일 안에 결과가 저장
cat < a.txt > b.txt 와 동일한 명령어는??
#cp a.txt b.txt