[완료]다이렉션에 대해 알고 싶습니다.

dvvbstation의 이미지

리눅스 처음 입문하는 입문자입니다.
나름 궁금한게 있어 질문 드립니다.
답변 주시면 좋겠습니다.

a.txt에는 aaaa
b.txt에는 bbbb
c.txt에는 cccc
d.txt에는 dddd
를 입력하고 저장하였습니다.

cat a.txt>b.txt>c.txt>d.txt
d.txt의 결과값? aaaa
b.txt=c.txt=null이 되는데요. 왜 이렇게 되는 건지 궁금합니다.

cat a.txt>>b.txt>>c.txt>>d.txt
d.txt의 결과값?
dddd
aaaa
가 됩니다.
b.txt=bbbb, c.txt=cccc
b.txt와 c.txt파일의 내용이 추가되지 않는 이유는 무엇인가요.
궁금합니다.

cat a.txt>b.txt>c.txt>d.txt 하면
d.txt는 a.txt의 내용으로 대체 되며 b.txt와 c.txt의 파일은 null이 되는데 왜 그런가.

ptmono의 이미지

저두 왜 그럴까 싶어 찾아봤습니다.

리다이렉션의 간단한 소스가

구글북서치

에 나오는 군요.

open 함수와 dup2 함수를 적용시키면 이해될 것 같습니다.

_______

*출력과 입력*

$ echo "aaa"
aaa

"aaa" 라는 것을 입력하면, 화면에 "aaa"라고 출력이 됩니다. 전자를 'standard
input' 줄여서 'stdin', 후자를 'standard output' 줄여서 'stdout' 라고 하는
군요. 간단히 출력, 입력이라고 부르겠습니다.

위의 echo 프로그램은 "aaa"를 입력 받아서, "aaa"를 화면에 출력하는 프로그램이
군요. 리다이렉션('>')을 사용하면 화면에 출력하는 것 대신에 파일에 출력할 수가
있군요.

$ echo "aaa" > a.txt
$ echo "bbb" > a.txt
$ cat a.txt
bbb

*어떤일이 일어나나*

$ cat a.txt>b.txt>c.txt>d.txt

위의 명령으로 어떠한 일이 일어나는지 보겠습니다.

1. 'b.txt' 파일을 연다. 파일의 내용은 사라집니다. open 함수를 사용합니다.
2. 화면으로 출력될 내용을 'b.txt'로 출력되게 합니다. dup2 함수를 사용합니다.
3. 'c.txt' 파일을 연다. 파일의 내용은 사라집니다. open 함수를 사용합니다.
4. 'b.txt'로 출력될 내용을 'c.txt'로 출력되게 합니다. dup2 함수를 사용합니다.
5. 'd.txt' 파일을 연다. 파일의 내용은 사라집니다. open 함수를 사용합니다.
6. 'c.txt'로 출력될 내용을 'd.txt'로 출력되게 합니다. dup2 함수를 사용합니다.
7. cat을 통해서 'a.txt'의 내용을 입력받습니다.
8. 입력받은 내용은 cat에 의해서 출력됩니다. 출력은 'd-txt'로 됩니다.

이상에서 b.txt와 b.txt 의 내용은 사라졌습니다.

$ cat a.txt>>b.txt>>c.txt>>d.txt

위의 명령으로 어떠한 일이 일어나는지 보겠습니다.

1. 'b.txt' 파일을 연다. 파일의 내용은 사라지지 않습니다. open 함수를 사용합니다.
2. 화면으로 출력될 내용을 'b.txt'로 출력되게 합니다. dup2 함수를 사용합니다.
3. 'c.txt' 파일을 연다. 파일의 내용은 사라지지 않습니다. open 함수를 사용합니다.
4. 'b.txt'로 출력될 내용을 'c.txt'로 출력되게 합니다. dup2 함수를 사용합니다.
5. 'd.txt' 파일을 연다. 파일의 내용은 사라지지 않습니다. open 함수를 사용합니다.
6. 'c.txt'로 출력될 내용을 'd.txt'로 출력되게 합니다. dup2 함수를 사용합니다.
7. cat을 통해서 'a.txt'의 내용을 입력받습니다.
8. 입력받은 내용은 cat에 의해서 출력됩니다. 출력은 'd-txt'로 됩니다.

*open 함수*

'>' 와 '>>' 의 차이는 "open 함수가 파일을 어떻게 여는가" 입니다. open 함수는
파일을 다음의 세가지 형태로 열어요. read-only, write-only, read/write.
read-only는 파일을 읽기만 할 때 사용합니다. 파일은 어떠한 변화도 일어나지
않습니다. write-only는 파일의 내용을 바꾸고 싶을 때 사용합니다. 단 기존의 내용은
사라집니다. read/write 는 파일에 내용을 추가하고 싶을 때에 사용합니다. 기존의
내용은 사라지지 않습니다.
'>'는 write-only를 사용합니다.
'>>'는 read/write를 사용합니다.

*결론*

결론적으로,
'>'에서 a.txt=b.txt=null 인 이유는 write-only로 파일을 열어서 파일의
내용이 사라져버렸기 때문입니다.
반면,
'>>'에서 b.txt, c.txt 가 변화되지 않는 이유는 read/write로 파일을 열어서 입니다.

'>>'에서 내용이 추가되지 않는 이유는 dup2 함수에 의해서 리다이렉션이 연차적으로
일어나서, b.txt와 c.txt에는 리다이렉션이 일어나지 않기 때문입니다.

*참고*

- "linux for programmers and users", Prentice Hall : 12.4.11. Redirection
- 메뉴얼 stdin(3) ($ man stdin)
- 메뉴얼 sh ; redirection 섹션
- 메뉴얼 open(2) ($ man open)
- 메뉴얼 dup2(2) ($ man dup2)
------------------------------------------
emacs user

------------------------------------------
emacs user

검객의 이미지

저도 궁금했었는데

write-only

read/write

이 차이였군요..

잘 보고 갑니다.

우리 항시 웃고 살아요 ^^

dvvbstation의 이미지

감사합니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.