Minishell redirections

1. ๋ฆฌ๋‹ค์ด๋ ‰์…˜

๋ฆฌ๋‹ค์ด๋ ‰์…˜์€ STDIN, STDOUT, STDERR๋ฅผ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ์ด๋‚˜ ํŒŒ์ผ๋กœ ์šฐํšŒํ• ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด์ด๋‹ค. ๊บฝ์‡  ๋ถ€ํ˜ธ >, <๋ฅผ ํ†ตํ•ด ๋ฐฉํ–ฅ์„ ์ง€์ •ํ•˜๋ฉฐ, [ํ”„๋กœ๊ทธ๋žจ] [๋ฆฌ๋‹ค์ด๋ ‰์…˜] [ํŒŒ์ผ/์ŠคํŠธ๋ฆผ]์˜ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

2. ๋ฆฌ๋‹ค์ด๋ ‰์…˜์˜ ๋™์ž‘ ์˜ˆ์‹œ

3. ๋ฆฌ๋‹ค์ด๋ ‰์…˜๊ณผ ํŒŒ์ดํ”„์˜ ์ฐจ์ด

๋ฆฌ๋‹ค์ด๋ ‰์…˜๊ณผ ํŒŒ์ด๋“œ ๋‘˜๋‹ค ํ‘œ์ค€์ž…๋ ฅ/์ถœ๋ ฅ/์—๋Ÿฌ์˜ ๋ฐฉํ–ฅ์„ ์šฐํšŒํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋„์ฐฉ์ง€์—์„œ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

4. HEREDOC(here document)

์ปดํ“จํŒ…์—์„œ ํžˆ์–ด ๋„ํ๋จผํŠธ(here document, here-document), ํžˆ์–ด ํ…์ŠคํŠธ(here-text), ํžˆ์–ด๋…(heredoc), ํžˆ์–ด์ด์ฆˆ(hereis), ํžˆ์–ด ์ŠคํŠธ๋ง(here-string), ํžˆ์–ด ์Šคํฌ๋ฆฝํŠธ(here-script)๋Š” ํŒŒ์ผ ๋ฆฌํ„ฐ๋Ÿด ๋˜๋Š” ์ŠคํŠธ๋ฆผ ๋ฆฌํ„ฐ๋Ÿด์ด๋‹ค. ๋งˆ์น˜ ๋ณ„๋„์˜ ํŒŒ์ผ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ์ด ์šฉ์–ด๋Š” ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ์ค„์˜ ์ŠคํŠธ๋ง ๋ฆฌํ„ฐ๋Ÿด์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉ๋˜๋ฉฐ ํ…์ŠคํŠธ ์•ˆ์˜ ์ค„ ๋ฐ”๊พธ๊ธฐ์™€ ๊ธฐํƒ€ ๊ณต๋ฐฑ(๋“ค์—ฌ์“ฐ๊ธฐ ํฌํ•จ)์„ ๋ณด์กดํ•œ๋‹ค.</p> โ€ฆ</p> ํžˆ์–ด ๋„ํ๋จผํŠธ๋Š” ํŒŒ์ผ ๋˜๋Š” ๋ฌธ์ž์—ด๋กœ ์ทจ๊ธ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ผ๋ถ€ ์…ธ์€ ์ด๊ฒƒ๋“ค์„ Printf ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ทจ๊ธ‰ํ•˜๋ฉฐ ์ด๋กœ์จ ๋ฆฌํ„ฐ๋Ÿด ๋‚ด์—์„œ ๋ณ€์ˆ˜ ์น˜ํ™˜๊ณผ ๋ช…๋ น์–ด ์น˜ํ™˜์„ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค. ์œ ๋‹‰์Šค ์…ธ์—์„œ ๊ธฐ์›ํ•œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํžˆ์–ด ๋„ํ๋จผํŠธ ๋ฌธ๋ฒ•์€ ยซ์™€ ๊ทธ ๋’ค์— ๋ถ™๋Š” ๊ตฌ๋ถ„ ๋ฌธ์ž ์‹๋ณ„์ž(์ข…์ข… EOF ๋˜๋Š” END), ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ค„์— ์ธ์šฉ ํ…์ŠคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋ฉฐ ์ธ์šฉ ํ…์ŠคํŠธ๋ฅผ ๋‹ซ์„ ๋•Œ์—๋Š” ๋˜‘๊ฐ™์€ ๊ตฌ๋ถ„ ๋ฌธ์ž ์‹๋ณ„์ž๊ฐ€ ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ๋ฒ•์€ ํžˆ์–ด ๋„ํ๋จผํŠธ๊ฐ€ ์ŠคํŠธ๋ฆผ ๋ฆฌํ„ฐ๋Ÿด์ž„์„ ์˜๋ฏธํ•˜๋ฉฐ ๋ฌธ์„œ์˜ ๋‚ด์šฉ์€ ์„ ํ–‰ ๋ช…๋ นdml stdin(ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ)์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋œ๋‹ค. ํžˆ์–ด ๋„ํ๋จผํŠธ ๋ฌธ๋ฒ•์€ โ€œ๋‹ค์Œ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๋Š”โ€ <์ธ ์ž…๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋ฌธ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๋‹ค.</p> ์œ„ํ‚ค๋ฐฑ๊ณผ โ€ฆ

heredoc์€ ์œ ๋‹‰์Šค์—์„œ ์—ฌ๋Ÿฌ ์ค„(\n)์˜ ๋ธ”๋ก์„ ์ „๋‹ฌํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฆฌ๋‹ค์ด๋ ‰์…˜์˜ ์œ ํ˜•์ด๋‹ค.

5. ๋™์ž‘ ์˜ˆ์‹œ

ํ•ด๋‹น๋ถ€๋ถ„์€ zsh๊ณผ bash์˜ ๋™์ž‘์ด ์ƒ๋‹นํžˆ ์ƒ์ดํ•˜๋‹ค. zsh๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด ๊ฑธ๋ฆฐ๊ฒฝ์šฐ ์ˆœ์„œ๋Œ€๋กœ ์ „๋ถ€ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, bash๋Š” ๋งˆ์ง€๋ง‰๊ฑฐ๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค(ํ•˜์ง€๋งŒ, >,ย ยป์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์€ ๋งŒ๋“ ๋‹ค.)

  1. cat <infile
    indfile
    
  2. cat <<END
    heredoc
    

    [zsh]pipe๋กœ ์—ฐ๊ฒฐ๋œ heredoc ๊ฐœ์ˆ˜๋งˆ๋‹ค pipe heredoc>, pipe pipe heredoc> ์œผ๋กœ ํ‘œ์‹œ๋จ.

[bash]๋ช‡๊ฐœ์˜ heredoc์ด ์žˆ๋˜์ง€๊ฐ„์— >๋กœ ํ‘œ์‹œ๋จ.

  1. $ cat < infile << END
    [zsh]
    infile
    heredoc
    
    [bash]
    heredoc
    
  2. $ cat -n infile | cat << END
    [zsh]
     1 infile
    heredoc
    
    [bash]
    heredoc
    

    [zsh]infile์ด echo๋˜๊ธฐ ์ „์— heredoc ์ž…๋ ฅ ์ปค์„œ(pipe heredoc>)๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ๋˜๊ณ  heredoc ์ข…๋ฃŒ ํ›„ ์ดํ›„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰๋จ.

[bash]๋‘๋ฒˆ์งธ cat << END์— ํ‘œ์ค€์ž…๋ ฅ์œผ๋กœ ํŒŒ์ดํ”„์™€ heredoc์ด ๋“ค์–ด์™”์ง€๋งŒ, ํŒŒ์ดํ”„๋Š” ์™„์ „ํžˆ ๋ฌด์‹œ๋˜๊ณ  heredoc๋งŒ์ด ์ž…๋ ฅ๋œ ๋ชจ์Šต.

  1. echo hi | cat -n <<END | cat <<END
    [zsh]
     1  hi
     2  heredoc1
    heredoc2
    
    [bash]
    heredoc2
    

    [zsh]์šฐ์„  ์ปค์„œ๋กœ pipe pipe heredoc>์ด ์ถœ๋ ฅ๋˜๊ณ , ์ฒซ๋ฒˆ์งธ END๊นŒ์ง€ ๋ฐ›์€ ์ž…๋ ฅ์€ cat -n <<END๋ถ€๋ถ„์—, ์ดํ›„๋ถ€ํ„ฐ ๋‘๋ฒˆ์งธ END๊นŒ์ง€ ๋ฐ›์€ ์ž…๋ ฅ์€ cat <<END์— ๋“ค์–ด๊ฐ„๋‹ค.

[bash]๋‚˜์žฅ ๋‚˜์ค‘์— ์ž…๋ ฅ๋˜๋Š” ํ‘œ์ค‘ ์ž…๋ ฅ๋งŒ์ด ์œ ํšจํ•˜๋ฏ€๋กœ ์‹น ๋ฌด์‹œ๋˜๊ณ  cat <<END๋งŒ์ด ์œ ํšจํ•ด์ง„๋‹คโ€ฆ

  1. cat infile <<END
    [bash]
    infile
    

    infile์€ cat์˜ ์ธ์ž์ด๋‹ค. ์ด๊ฑด catํ”„๋กœ๊ทธ๋žจ ์ž์ฒด์—์„œ ์ •์˜ํ•˜๋Š” ๋™์ž‘์ด๋‹ค.

  2. cat <<END <infile <<END
    [bash]
    heredoc2
    

    bash์—์„  ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž…๋ ฅ์ด ๋“ค์–ด์™€๋„ ์‹น ๋ฌด์‹œ๋˜๊ณ  ๋งˆ์ง€๋ง‰๊ฑฐ๋งŒ ์œ ํšจํ•˜๋‹คโ€ฆ

6. ๊ตฌํ˜„๋ฐฉ์‹

6.1. ๋ฆฌ๋‹ค์ด๋ ‰์…˜์˜ ๋ฐฉํ–ฅ์„ฑ

=> ๋”ฐ๋ผ์„œ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๊ตฌํ˜„์‹œ ์ผ๋‹จ ๋ชจ๋“  ๋ฆฌ๋‹ค์ด๋ ‰์…˜์œผ๋กœ ๋“ค์–ด์˜จ ๋ชจ๋“  ํŒŒ์ผ/heredoc์„ ์—ด๊ฑฐ๋‚˜, ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋งŒ ๋ฐ˜์˜ํ•˜์—ฌ ์ž…์ถœ๋ ฅ์„ dup2๋กœ ๊บฝ์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. ๋˜ํ•œ ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•œ dup2๋’ค์— ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ํ†ตํ•œ dup2๋ฅผ ๋” ๋‚˜์ค‘์— ๋‘์–ด, ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง€๊ฒŒ ํ•˜์˜€๋‹ค.

+์ถ”๊ฐ€ : ๋‹จ์ผ ๋นŒํŠธ์ธ ๋ช…๋ น์„ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ช…๋ น ์ž…๋ ฅํ›„ ๊ธฐ์กด์— dup๋กœ ์ €์žฅํ•œ ํ‘œ์ค€์ž…์ถœ๋ ฅ์œผ๋กœ ์ž…์ถœ๋ ฅ์„ ์žฌ์„ค์ •ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์•ˆ๊ทธ๋Ÿฌ๋ฉด ์ดํ›„์˜ ์ž…๋ ฅ์ด ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋œ์ฑ„๋กœ ๋‚จ์•„์žˆ๋Š”๋‹ค.

6.2. heredoc

heredoc์€ DELIMITER๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๋‚˜์˜ค๊ธฐ์ „๊นŒ์ง€ ์ž…๋ ฅ๋œ (์—ฌ๋Ÿฌ์ค„์˜)์ž…๋ ฅ์„ ๋ฐ›์„์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž๋“ค์„ ํ”„๋กœ๊ทธ๋žจ(๋žจ์˜ ์ž๋ฃŒ๊ตฌ์กฐ)์— ์ €์žฅํ• ์ง€, ํŒŒ์ผ์‹œ์Šคํ…œ(hdd/ssd์˜ ํŒŒ์ผ)์— ์ €์žฅํ• ์ง€ ๊ณ ๋ฏผ์„ ํ–ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋“ค๋„ ํŒŒ์ผ๋“ค๊ฐ„์˜ ์ž…์ถœ๋ ฅ์ธ์ , ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜๋ฉด ๋ฒ„ํผ๋“ฑ์˜ ์ œํ•œ์—์„œ ์ž์œ ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ์‹œ์Šคํ…œ์— heredoc(.doc1, .doc2...)์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์˜€๋‹ค.

์ด๋•Œ, heredocํŒŒ์ผ์˜ ์œ„์น˜๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ๋ณ€ํ•˜์ง€ ์•Š์„ ์ €์žฅํ•˜๋Š”๊ฒŒ ๋งž๋‹ค. ํ•˜์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ™˜๊ฒฝ(์ ‘๊ทผ๊ถŒํ•œ)์„ ๊ณ ๋ คํ•˜์—ฌ ํ˜„์žฌ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์œ„์น˜๋กœ ํƒ€ํ˜‘ํ•œ๋‹ค.

+์ถ”๊ฐ€ : heredoc๊ฐ€ ์ปค๋งจ๋“œ์— ์žˆ๋‹ค๋ฉด ์ปค๋งจ๋“œ ์‹คํ–‰ ์ „์— ๋ชจ๋“  heredoc์„ ์ „๋ถ€ ๋ฐ›๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.

์ฐธ๊ณ  1 ์ฐธ๊ณ  2 ์ฐธ๊ณ  3 ์ฐธ๊ณ  4