2021. 7. 28. 15:01ㆍLinux
이번 시간에는 리다이렉션을 배울것입니다.
리다이렉션(redirection)이란?
다이렉션 : 방향 re : 다시, 즉 방향을 다시 설정할 수 있는 것입니다.
그럼 무슨 방향을 다시 설정 할 수 있다는 걸까요? 바로 입출력 & 오류 출력 방향을 말하는 것입니다.
우선 표준 입출력 & 오류 출력 장치에 대해 배워보겠습니다.
표준 입력 장치는 키보드를 의미하고 표준 출력 장치와 표준 오류 장치는 모니터를 의미합니다.
즉 키보드로 입력을 하면 입력한 결과를 모니터로 출력을 하게되고 오류가 발생시 이 또한 모니터를 통해 보여진다는 뜻입니다.
리다이렉션은 이 표준 장치들을 다시 설정 즉 변경 할 수 있습니다
리눅스에서는 모든 데이터를 파일로 관리한다고 말 한적이 있습니다. 장치들도 파일로 관리하기 때문에 입출력 & 오류 출력 장치들도 파일로 관리하는 것입니다.
리다이렉션을 사용할 때에는 <, >, >> 명령어를 사용하고 장치들을 파일로 관리 하기 때문에 입출력 & 오류 출력 장치들에 접근 할 때에는 파일 디스크립터를 사용합니다.
파일 디스크립터(file Descriptor) : 리눅스에서 프로세스(process)가 파일을 다룰 때 사용하는 개념입니다.
즉 프로세스가 파일에 접근할 때 사용하는 값인 것입니다.
프로세스(process) : 현재 실행중인 프로그램을 의미합니다.
파일 디스크립터와 프로세스에 대한 자세한 내용은 다음에 다루겠습니다.
표준 출력 장치 : 파일 디스크립터 1번을 사용합니다.
출력 리다이렉션 : >, >> 을 사용하여 표준 출력 장치를 바꿔줍니다.명령어를 사용하면 모니터를 통해 출력이 되었습니다. 이를 파일로 출력이 되도록 바꿔보겠습니다.명령어 1> 파일명
다시 한번더 사용해 보겠습니다
1>를 사용하여 표준 출력 장치를 lsout이라는 파일로 변경 해주었더니 사용 할때마다 안에 내용이 초기화 되는 것을 알 수 있습니다.
>>를 사용하면 기존 파일의 내용에 덮어쓰지 않고 기존 파일의 내용에 새로운 출력을 추가합니다.
표준 출력 장치는 기본 값이기 때문에 1번을 생략해도 상관 없습니다.
명령 1> 파일명 = 명령 > 파일명
명령 1>> 파일명 = 명령 >> 파일명
표준 오류 장치 : 파일 디스크립터 2번을 사용합니다
오류 리다이렉션 : 오류 장치 또한 >, >>를 사용해서 변경합니다.
없는 파일을 조회하거나 없는 명령어를 사용하면 오류를 모니터로 출력합니다. 이를 파일에 출력 하도록 해보겠습니다.
잘못된 명령어를 사용해서 오류가 난 것입니다. 오류 메세지가 모니터에 출력된것을 볼 수 있습니다.
이는 표준출력장치 디스크립터(1번, 생략 가능)를 사용해서 리다이렉션 시켰기 때문에 오류 메세지가 그대로 모니터에 출력 된 것입니다. 리다이렉션 시킨뒤 lsout 파일을 읽었더니 아무 내용도 없는 것을 확인 할 수 있습니다.
?? 왜일까요? >를 사용하면 전에 있던 내용을 오버라이트(덮어쓰기)한다는 것은 배웠습니다. 그럼 새로운 내용이라도 있어야 하는데 빈 파일인 이유는 무엇일까요?
우선 저희는 표준출력장치 디스크립터를 사용해서 파일로 리다이렉션 시켰습니다. 즉 파일로 출력 내용이 저장되는 것입니다. 하지만 저희는 ca라는 잘못된 명령어를 사용해서 출력 된 내용이 없었습니다.
출력된건 명령어를 잘못 입력했다는 오류 메세지인것입니다.
아무런 내용이 출력되지 않았지만 파일로 리다이렉션 했기 때문에 공백이 파일을 오버라이트 시킨 것입니다.
그렇기 때문에 lsout 파일이 빈 파일이 되어 버린 것입니다
오류 메세지를 모니터가 아닌 파일로 리다이렉션 시키기 위해서는 표준 오류 장치의 디스크립터 인 2번을 사용해야합니다.
오류 내용이 모니터에 출력이 안되고 lsout 파일에 저장된 것을 확인 할 수 있습니다.
같은 파일에 또 다른 오류를 저장할 떄 위에서 배운 것처럼 >>를 사용하면 오버라이트를 막을 수 있습니다.
표준 입력 장치 : 파일 디스크립터 0번을 사용합니다
입력 리다이렉션 : < 명령어를 사용합니다.
우선 표준 입력인 키보드를 사용하는 명령어를 알아보겠습니다. 이 명령어는 저희가 이미 아는 명령어 입니다.
바로 cat 명령어입니다. cat 명령어는 저희가 파일 내용을 읽을때 cat 파일명 과 같은 형식으로 많이 사용한 명령어 입니다.
cat은 사실 키보드(표준 입력 장치)로부터 입력을 받고 모니터(표준 출력 장치)로 출력을 해주는 명령어입니다. cat이라는 명령어를 리눅스에서 사용해 보겠습니다.
cat 명령어를 사용하면 다음줄에 입력을 할 수 있도록 바뀝니다.
입력한 내용은 바로 출력 되며 다시 입력 할 수 있도록 바뀝니다. 이 상태에서 Ctrl + d를 누르면 빠져 나오게 됩니다.
위에서 배운 출력 리다이렉션을 사용해서 입력한 내용을 파일에 저장할 수 있습니다.
cat >> 파일명 이후 다음줄 부터 입력한 내용은 파일에 저장됩니다.
이제 표준 입력을 재지정 해보겠습니다.
cat 0< 파일명
< 리다이렉션 연산자를 사용해서 표준 입력을 키보드에서 파일로 변경 했습니다.
어디서 많이 봤던 결과가 나왔습니다. 0<은 생략이 가능하기 때문에 결론적으로 cat 0< 파일명은 cat 파일명과 같은 것입니다. 즉 저희는 지금까지 표준 입력을 파일로 지정해서 사용하고 있었던 것입니다.
* 표준 입력을 키보드가 아닌 파일로 지정한다는 뜻은 직접 내용을 키보드로 입력하는 것이 아닌 파일에 미리 입력을 해두고 그 파일을 읽음으로써 입력을 대신 한다는 뜻입니다.
cat >> food인 경우 표준 입력 장치인 키보드를 사용해서 food 파일 안에 들어갈 내용을 직접 입력 했어야 했습니다.
하지만 cat 0< hungry >> food 인 경우 표준 입력 장치를 파일로 지정 했기 때문에 키보드로 입력 할 필요 없이 미리
입력해준 파일(hungry)이 입력이 되어 food 파일에 저장되는 것입니다.
마지막으로 하나더 배워보겠습니다.
저희는 전에 하드링크를 배웠습니다. 하드링크로 연결된 파일들이 한곳이 아닌 여러곳에 존재해 있다면 직접 일일히 찾는것은 거의 불가능한 일입니다. 하드링크로 연결된 파일들은 같은 i-node number를 가지고 있습니다. 그렇기 때문에 find 명령어를 사용하여 동일한 i-node number를 가지고 있는 파일들을 검색하면 어디에 있는지 경로를 찾을 수 있습니다. 이 떄 사용할 명령어가 지금까지 배운 리다이렉션입니다.
우선 하드링크를 검색해보겠습니다
find 명령어를 사용해서 i-node number가 763187인 파일들을 검색해보겠습니다.
find / -inum 763187
결국 찾긴 했지만 수 많은 허가 거부 오류 메세지가 뜨는 것을 볼 수 있습니다.
그럼 저희가 배운 오류 리다이렉션을 사용하여 오류 출력 장치를 /dev/null 파일로 보낼 것입니다. 그러면 오류 메세지가 없이 저희가 찾을려는 결과만 출력될 것입니다.
/dev/null : 이 파일은 항상 비어 있으며 이 파일로 전송되는 데이터는 버려집니다
결과가 깔끔하게 나오는것을 볼 수 있습니다
위와 같이 수 많은 오류가 나오는 이유는 find 뒤에 / 를 사용했기 때문입니다
find 뒤에 /를 사용한 것은 검색하는 범위를 루트(/)로 지정하여 전체 시스템 중 특정 파일을 검색하겠다는 뜻입니다.
전체 시스템에서 검색을 하는데 일반 사용자가 검색을 했기 때문에 권한 부족으로 오류가 떴던 것입니다.
그럼 su 명령어를 사용하면 오류가 안뜰까요?
단 하나의 파일 말고는 오류가 발생하지 않는다는 것을 볼 수 있습니다.
근데 root는 최고 관리자 계정인데 허가 거부하는 파일이 있는 이유는 무엇일까요?
이는 다음에 find 명령어를 자세히 공부할 때 다시 다루도록 하겠습니다. Linux - find & locate
사실 일반 사용자는 자신의 홈 디렉터리 외에는 접근할 권한이 없기 때문에 find에 / 옵션을 사용해도 아무런 소용이 없습니다. 그저 오늘 배운 리다이렉션을 연습하기 위해 find /를 사용 한 것입니다. 일반 사용자가 검색할 일은 자신의 홈 디렉터리 범위에서이기 때문에 그냥 find만 사용해도 충분 합니다.
대신 그냥 find를 사용 할 경우 현재 위치에서 검색을 하기 때문에 검색을 할때 꼭 홈 디렉터리에서 하는 것을 추천합니다.
이상으로 리다이렉션 공부를 마치겠습니다.
다음 내용
'Linux' 카테고리의 다른 글
Linux - 권한(permission)(1) (0) | 2021.07.31 |
---|---|
Linux - 사용자 & 그룹 생성 및 제거 (0) | 2021.07.29 |
리눅스 - MAC Time (0) | 2021.07.25 |
Linux - 디렉터리 & 파일(3) (0) | 2021.07.23 |
Linux - 디렉터리 & 파일(2) (0) | 2021.07.22 |