[Linux] IO Redirection - Standard Output 순서에 대한 고찰

하미니똑또케·2024년 1월 22일

Linux

목록 보기
1/3

강의 내용 출처: https://www.youtube.com/watch?v=l39yXacR1_s

위 이미지는 ls의 결과 output이 result.txt 파일에 기록되는 리다이렉션하는 간단한 예제이다. 현재는 >가 1개밖에 없으므로 계속 새롭게 덮어쓰는 형태가 될 것이다.

다만 나는 궁금해져버렸다.

캡쳐본처럼 ls -al 하고 난 result.txt의 파일 사이즈와 실제로 열어본 result.txt의 파일 사이즈와 내용이 일치하지 않을까?

아무것도 없는 디렉토리에서 위와 같은 과정을 여러 번 반복해보았으나, 똑같은 수행을 여러번 해도, ls -al 했을 때는 파일 사이즈가 168인데 cat result.txt를 하면 계속 파일 사이즈가 0이었다.

나와 언뜻 비슷해보이는 질문을 2년 전에 올렸던 사람이 있었는데, 해결되지 않은 듯 했다.

꼭 그렇게 중요하지도 않은 거 하나에 꽂히면 그거 알 때까지 찾고 해결을 보거나, 그렇지 못하면 그대로 그냥 하루를 종료하는 성격인지라 또 호기심이 도져버려서 찾아나서기 시작했다.

이것저것 뒤적거리다가 강의 출처인 이고잉 홈페이지의 영상 댓글에서 힌트를 발견하고 구글링을 제대로 다시 해보기 시작했다. 그래! '>' 의 순서대로 처리되는 게 아닐 수 있겠구나 (이제야 알았냐)

왜 redirction한 결과가 empty file로 기록되는 지에 대해 검색했고, stackoverflow 답변은 다음과 같았다.

참조로 많이 달렸던 GNU 공식 사이트의 Redirection 설명도 캡쳐본으로 아래와 같이 추가했다.

결론적으로 내가 이해한 Redirection이 진행되는 과정은 다음과 같다.

(틀린 부분은 곱게 지적해주시면 바로 수정 들어가겠습니다)

  1. Standard Output으로 지정된 result.txt 파일이 먼저 생성된다
  2. '>'는 매번 새로 덮어쓰기때문에 file size 0으로 truncate된다
  3. ls 프로세스가 수행된다.
  4. ls 수행된 당시에는 result.txt에 무언가 기록되지 않은 시점이니, file size가 여전히 0이고 그 순간을 Redirect시켜서 result.txt에 담는다.
  5. Redirect가 되었으므로, 이제는 result.txt에 내용이 기록된, 파일 사이즈가 0이 아니게 기록이 된다.

그래서 캡쳐본을 다시 보면,

ls -al 한 순간은 ls의 프로세스가 모두 다 돌고 redirection까지 끝난 상황이니까 result.txt의 파일 사이즈가 0이 아닌 것인데,

막상 result.txt 파일을 열어보면, ls 하는 그 순간에서는 파일이 막 생성되거나 리셋된 지점이었을테니 파일 사이즈가 0이었다.

재밌다 재밌어.. ㅎ

profile
제가 하미니는 아니구요.. 하미니가 똑똑하다고 생각하는 사람입니다.

0개의 댓글