<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>기타 Archives - 어제와 내일의 나 그 사이의 이야기</title>
	<atom:link href="https://lycos7560.com/category/etc/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>생각의 흐름을 타고 다니며 만드는 블로그</description>
	<lastBuildDate>Tue, 12 May 2026 22:30:47 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://lycos7560.com/wp-content/uploads/2022/11/cropped-cropped-cropped-log-1-150x150-1-80x80.png</url>
	<title>기타 Archives - 어제와 내일의 나 그 사이의 이야기</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>POSIX Shell: 환경변수(Environment Variable)</title>
		<link>https://lycos7560.com/etc/posix-shell-%ed%99%98%ea%b2%bd%eb%b3%80%ec%88%98environment-variable/40632/</link>
					<comments>https://lycos7560.com/etc/posix-shell-%ed%99%98%ea%b2%bd%eb%b3%80%ec%88%98environment-variable/40632/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Tue, 12 May 2026 22:15:59 +0000</pubDate>
				<category><![CDATA[개인 공부 저장용]]></category>
		<category><![CDATA[기타]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[공부]]></category>
		<category><![CDATA[기초]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40632</guid>

					<description><![CDATA[<p>환경변수는 시스템의 설정값이나 실행 경로 등, 운영체제 전반에 걸쳐 공유되어야 하는 정보를 담고 있습니다. 일반 변수 vs 환경 변수 가장 큰 차이점은 &#8216;전파(Inheritance)&#8217;입니다. export 명령어: 환경변수 만들기 일반 변수를 환경변수로 승격시킬 때 export를 사용합니다. 주요 표준 환경변수 POSIX 시스템(Linux, AIX 등)에서 미리 정의되어 자주 쓰이는 변수들입니다. 변수명 설명 $PATH 명령어를 찾을 디렉토리 경로 목록 (콜론 [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-%ed%99%98%ea%b2%bd%eb%b3%80%ec%88%98environment-variable/40632/">POSIX Shell: 환경변수(Environment Variable)</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-59c788c2      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#일반-변수-vs-환경-변수" class="uagb-toc-link__trigger">일반 변수 vs 환경 변수</a><li class="uagb-toc__list"><a href="#export-명령어-환경변수-만들기" class="uagb-toc-link__trigger">export 명령어: 환경변수 만들기</a><li class="uagb-toc__list"><a href="#주요-표준-환경변수" class="uagb-toc-link__trigger">주요 표준 환경변수</a><li class="uagb-toc__list"><a href="#실전-예제-path-변수-조작하기" class="uagb-toc-link__trigger">실전 예제: PATH 변수 조작하기</a><li class="uagb-toc__list"><a href="#환경변수-확인법" class="uagb-toc-link__trigger">환경변수 확인법</a><li class="uagb-toc__list"><a href="#주의사항-변수의-수명" class="uagb-toc-link__trigger">주의사항: 변수의 수명</a><li class="uagb-toc__list"><a href="#환경에-따른-분기-case문-결합" class="uagb-toc-link__trigger">환경에 따른 분기 (case문 결합)</a><li class="uagb-toc__list"><a href="#자식에서-export로-변경하면-부모도-영향을-받나" class="uagb-toc-link__trigger">자식에서 export로 변경하면 부모도 영향을 받나?</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#왜-부모는-영향을-받지-않나" class="uagb-toc-link__trigger">왜 부모는 영향을 받지 않나?</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#예시-코드로-확인하기" class="uagb-toc-link__trigger">예시 코드로 확인하기</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#자식이-부모의-환경을-바꾸고-싶을-땐" class="uagb-toc-link__trigger">자식이 부모의 환경을 바꾸고 싶을 땐?</a></ul></ol>					</div>
									</div>
				</div>
			


<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>환경변수는 시스템의 설정값이나 실행 경로 등, 운영체제 전반에 걸쳐 공유되어야 하는 정보를 담고 있습니다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">일반 변수 vs 환경 변수</h2>



<p>가장 큰 차이점은 &#8216;전파(Inheritance)&#8217;입니다.</p>



<ul class="wp-block-list">
<li><strong>일반 변수 (Local Variable):</strong> 현재 실행 중인 스크립트 내에서만 유효합니다.</li>



<li><strong>환경 변수 (Environment Variable):</strong> <code>export</code> 명령어를 통해 시스템의 &#8216;환경&#8217;으로 등록되어, 해당 쉘에서 실행하는 다른 스크립트나 프로그램에서도 읽을 수 있습니다.</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">export 명령어: 환경변수 만들기</h2>



<p>일반 변수를 환경변수로 승격시킬 때 <code>export</code>를 사용합니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 1. 선언과 동시에 export (가장 많이 쓰임)
export MY_APP_HOME="/usr/local/engcross"

# 2. 이미 있는 변수를 export
VERSION="2.1.0"
export VERSION</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">주요 표준 환경변수</h2>



<p>POSIX 시스템(Linux, AIX 등)에서 미리 정의되어 자주 쓰이는 변수들입니다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>변수명</strong></td><td><strong>설명</strong></td></tr></thead><tbody><tr><td><strong><code>$PATH</code></strong></td><td>명령어를 찾을 디렉토리 경로 목록 (콜론 <code>:</code>으로 구분)</td></tr><tr><td><strong><code>$HOME</code></strong></td><td>현재 사용자의 홈 디렉토리 경로</td></tr><tr><td><strong><code>$USER</code></strong></td><td>현재 접속한 사용자 이름</td></tr><tr><td><strong><code>$PWD</code></strong></td><td>현재 작업 디렉토리 (Print Working Directory)</td></tr><tr><td><strong><code>$LANG</code></strong></td><td>시스템 언어 및 인코딩 (예: <code>ko_KR.UTF-8</code>)</td></tr><tr><td><strong><code>$SHELL</code></strong></td><td>현재 사용 중인 쉘의 경로</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">실전 예제: PATH 변수 조작하기</h2>



<p>내가 만든 스크립트를 어디서든 파일명만 입력해서 실행하고 싶을 때 <code>$PATH</code>를 수정합니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

# 현재 PATH 끝에 내 스크립트 폴더 추가
export PATH="$PATH:/home/lycos7560/bin"

# 이제 /home/lycos7560/bin 안에 있는 파일들은 
# 절대 경로 없이 이름만으로 실행 가능합니다.</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">환경변수 확인법</h2>



<ul class="wp-block-list">
<li><code>env</code>: 현재 설정된 모든 환경변수 목록 출력</li>



<li><code>printenv PATH</code>: 특정 환경변수(<code>PATH</code>)의 값만 출력</li>



<li><code>set</code>: 환경변수뿐만 아니라 일반 변수, 함수까지 모두 포함해서 출력</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">주의사항: 변수의 수명</h2>



<p>스크립트 내부에서 <code>export</code>한 변수는 <strong>그 스크립트가 종료되면 사라집니다.</strong></p>



<ul class="wp-block-list">
<li><strong>부모 쉘(터미널)에 적용하고 싶다면?</strong></li>
</ul>



<p>스크립트를 실행할 때 <code>./script.sh</code>가 아닌 <code>source ./script.sh</code> 또는 <code>. ./script.sh</code>를 사용해야 합니다. (이를 <strong>Sourcing</strong>이라고 합니다.)</p>



<ul class="wp-block-list">
<li><strong>영구히 적용하고 싶다면?</strong></li>
</ul>



<p>사용자의 홈 디렉토리에 있는 <code>.profile</code> (또는 <code>.bash_profile</code>) 파일에 <code>export</code> 구문을 적어두어야 로그인할 때마다 로드됩니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">## parent.sh
#!/bin/sh
VAR1="Local"      # 일반 변수
export VAR2="Env" # 환경 변수

./child.sh        # 자식 프로세스 실행

## child.sh
#!/bin/sh
printf "VAR1: %s\n" "$VAR1" # 아무것도 안 나옴 (상속 안 됨)
printf "VAR2: %s\n" "$VAR2" # "Env" 출력 (상속 됨)

[결과]
$ ./parent.sh
VAR1: 
VAR2: Env

추가적으로 중요한 점은 자식이 가방(환경변수) 속 내용을 수정하거나 새 물건을 넣어도, 그 결과가 부모에게 돌아오지 않는다는 것입니다. 
자식이 종료되면 자식이 가졌던 가방 복사본은 그대로 파기되기 때문입니다.</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">환경에 따른 분기 (case문 결합)</h2>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

# 실행 환경(USER)에 따라 다른 설정 적용
case "$USER" in
    root)
        export LOG_LEVEL="DEBUG"
        export APP_PATH="/opt/app"
        ;;
    lycos7560)
        export LOG_LEVEL="INFO"
        export APP_PATH="/home/lycos7560/app"
        ;;
    *)
        printf "허용되지 않은 사용자입니다.\n"
        exit 1
        ;;
esac

printf "사용자: %s, 로그레벨: %s\n" "$USER" "$LOG_LEVEL"</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>환경변수는 스크립트가 외부 세계와 소통하는 통로입니다. </p>



<p><code>export</code>를 통해 내가 만든 설정값을 하위 프로그램에 전달하고, <code>$PATH</code>나 <code>$USER</code> 같은 시스템 변수를 이용해 상황에 맞는 유연한 스크립트를 작성해 보세요!</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">자식에서 export로 변경하면 부모도 영향을 받나?</h2>



<p><strong>아니요. 부모는 전혀 영향을 받지 않습니다.</strong></p>



<p>이것은 쉘 스크립트 시스템의 아주 중요한 철칙인 <strong>&#8216;일방통행 상속&#8217;</strong> 때문입니다.</p>



<h3 class="wp-block-heading">왜 부모는 영향을 받지 않나?</h3>



<p>부모가 자식 프로세스를 만들 때, 부모의 환경변수를 그대로 주는 게 아니라 &#8216;복사본&#8217;을 복사해서 넘겨주기 때문입니다.</p>



<p>자식이 자기 손에 든 복사본 가방 안의 내용을 아무리 고치고 <code>export</code>를 다시 해도, 그것은 <strong>자신의 가방(자식 프로세스의 메모리)</strong> 내에서의 일일 뿐입니다. </p>



<p>부모의 가방(부모 프로세스의 메모리)은 멀리 떨어져서 보호받고 있습니다.</p>



<h3 class="wp-block-heading">예시 코드로 확인하기</h3>



<p>child.sh</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh
export MY_VAL="Changed by Child"
printf "자식: 값을 변경했습니다 -> %s\n" "$MY_VAL"</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>parent.sh</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh
export MY_VAL="Original Parent Value"

printf "부모: 실행 전 값 -> %s\n" "$MY_VAL"

# 자식 스크립트 실행
./child.sh

printf "부모: 자식 종료 후 값 -> %s\n" "$MY_VAL"</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>실행 결과:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">부모: 실행 전 값 -> Original Parent Value
자식: 값을 변경했습니다 -> Changed by Child
부모: 자식 종료 후 값 -> Original Parent Value</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">자식이 부모의 환경을 바꾸고 싶을 땐?</h3>



<p>자식 프로세스를 &#8216;별도로&#8217; 띄우지 않고, <strong>부모의 몸 안에서 직접 실행</strong>하게 하면 됩니다. </p>



<p>이것을 <strong>Sourcing(소싱</strong>)이라고 합니다.</p>



<ul class="wp-block-list">
<li><strong>일반 실행 (<code>./child.sh</code>):</strong> 새로운 자식 쉘을 생성 (부모 영향 X)</li>



<li><strong>소싱 실행 (<code>. ./child.sh</code>):</strong> 현재 부모 쉘에서 코드를 그대로 읽어서 실행 (부모 영향 O)</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>이 개념은 보안과 안정성을 위한 개념입니다.</p>



<p>자식 프로그램이 멋대로 부모 시스템의 설정을 변경하면 문제가 되기 때문이죠.</p>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-%ed%99%98%ea%b2%bd%eb%b3%80%ec%88%98environment-variable/40632/">POSIX Shell: 환경변수(Environment Variable)</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/posix-shell-%ed%99%98%ea%b2%bd%eb%b3%80%ec%88%98environment-variable/40632/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>POSIX Shell: case 문</title>
		<link>https://lycos7560.com/etc/posix-shell-case-%eb%ac%b8/40629/</link>
					<comments>https://lycos7560.com/etc/posix-shell-case-%eb%ac%b8/40629/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Tue, 12 May 2026 22:07:50 +0000</pubDate>
				<category><![CDATA[개인 공부 저장용]]></category>
		<category><![CDATA[기타]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[공부]]></category>
		<category><![CDATA[기초]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40629</guid>

					<description><![CDATA[<p>if 문이 &#8220;예/아니오&#8221;라는 논리적 판단에 강하다면, case 문은 &#8220;이 값은 어디에 해당하나?&#8221;라는 패턴 매칭에 최적화되어 있습니다. 코드의 가독성을 높여주는 case 문의 모든 것을 알아봅니다. 기본 구조 case 문은 변수의 값을 여러 패턴과 비교하며, 처음으로 일치하는 블록을 실행합니다. 활용 가능한 패턴 종류 POSIX 표준에서 지원하는 패턴들입니다. 정규표현식과는 조금 다르니 주의하세요! 예제 ① 스크립트 인자(Argument) 처리 : [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-case-%eb%ac%b8/40629/">POSIX Shell: case 문</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-66d4106a      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#기본-구조" class="uagb-toc-link__trigger">기본 구조</a><li class="uagb-toc__list"><a href="#활용-가능한-패턴-종류" class="uagb-toc-link__trigger">활용 가능한 패턴 종류</a><li class="uagb-toc__list"><a href="#예제" class="uagb-toc-link__trigger">예제</a><li class="uagb-toc__list"><a href="#사용자-입력yn-대소문자-무시하기" class="uagb-toc-link__trigger">사용자 입력(y/n) 대소문자 무시하기</a><li class="uagb-toc__list"><a href="#고급-bash-전용-기능-주의사항" class="uagb-toc-link__trigger">고급: Bash 전용 기능 주의사항</a><li class="uagb-toc__list"><a href="#if-vs-case-언제-무엇을-쓸까" class="uagb-toc-link__trigger">if vs case: 언제 무엇을 쓸까?</a></ol>					</div>
									</div>
				</div>
			


<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p><code>if</code> 문이 &#8220;예/아니오&#8221;라는 논리적 판단에 강하다면, <strong><code>case</code> 문</strong>은 &#8220;이 값은 어디에 해당하나?&#8221;라는 <strong>패턴 매칭</strong>에 최적화되어 있습니다. </p>



<p>코드의 가독성을 높여주는 <code>case</code> 문의 모든 것을 알아봅니다.</p>



<h2 class="wp-block-heading">기본 구조</h2>



<p><code>case</code> 문은 변수의 값을 여러 패턴과 비교하며, 처음으로 일치하는 블록을 실행합니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">case "$변수" in
    패턴1)
        명령어
        ;;  # 블록 종료 (C의 break와 유사)
    패턴2|패턴3)
        명령어  # | 로 OR 조건 표현 가능
        ;;
    *)
        명령어  # 일치하는 패턴이 없을 때 (else 역할)
        ;;
esac  # case를 거꾸로 쓴 것</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">활용 가능한 패턴 종류</h2>



<p>POSIX 표준에서 지원하는 패턴들입니다. 정규표현식과는 조금 다르니 주의하세요!</p>



<ul class="wp-block-list">
<li><code>*</code>: 모든 문자열과 일치 (Default 처리용)</li>



<li><code>?</code>: 임의의 문자 <strong>딱 1개</strong>와 일치</li>



<li><code>[abc]</code>: a, b, c 중 하나와 일치</li>



<li><code>[a-z]</code>: 소문자 a부터 z 사이의 문자 하나와 일치</li>



<li><code>pat1|pat2</code>: 패턴1 또는 패턴2 중 하나와 일치 (<strong>OR 조건</strong>)</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">예제</h2>



<p>① 스크립트 인자(Argument) 처리 : 서비스 관리 스크립트(<code>start</code>, <code>stop</code> 등)를 만들 때 가장 많이 쓰이는 방식입니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

ACTION="$1"

case "$ACTION" in
    start)
        printf "서비스를 시작합니다...\n"
        ;;
    stop)
        printf "서비스를 중지합니다...\n"
        ;;
    restart|reload)
        printf "재시작/설정 로드를 수행합니다...\n"
        ;;
    status)
        printf "현재 상태를 확인합니다...\n"
        ;;
    *)
        printf "사용법: %s {start|stop|restart|status}\n" "$0"
        exit 1
        ;;
esac</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>② 파일 확장자별 분기 처리 : <code>${FILE##*.}</code>와 조합하면 매우 강력해집니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

FILE="backup.tar.gz"
EXT="${FILE##*.}"

case "$EXT" in
    gz|tgz)
        printf "Gzip 압축 파일입니다. 해제 명령: tar xzf %s\n" "$FILE"
        ;;
    zip)
        printf "Zip 파일입니다. 해제 명령: unzip %s\n" "$FILE"
        ;;
    log)
        printf "로그 파일입니다. 실시간 모니터링을 시작합니다.\n"
        ;;
    *)
        printf "지원하지 않는 파일 형식입니다: %s\n" "$EXT"
        ;;
esac</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">사용자 입력(y/n) 대소문자 무시하기</h2>



<p>사용자로부터 <code>yes</code>, <code>Yes</code>, <code>YES</code> 등을 한 번에 입력받고 싶을 때 대괄호(<code>[]</code>) 패턴이 유용합니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

printf "계속 진행하시겠습니까? [y/n]: "
read ANSWER

case "$ANSWER" in
    [yY]|[yY][eE][sS])
        printf "진행을 결정하셨습니다.\n"
        ;;
    [nN]|[nN][oO])
        printf "작업을 취소합니다.\n"
        exit 0
        ;;
    *)
        printf "잘못된 입력입니다. y 또는 n을 입력해 주세요.\n"
        exit 1
        ;;
esac</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">고급: Bash 전용 기능 주의사항</h2>



<p>Bash 4.0 이상에서는 <code>;</code> 대신 <code>;&amp;</code> (fall-through)나 <code>;;&amp;</code> 등을 사용할 수 있지만, 이는 <strong>POSIX 표준이 아닙니다.</strong></p>



<ul class="wp-block-list">
<li><strong><code>; &amp;</code></strong>: 다음 패턴의 일치 여부와 상관없이 무조건 다음 블록을 실행합니다.</li>



<li><strong><code>;; &amp;</code></strong>: 다음 패턴들을 계속 검사하여 일치하는 것이 있다면 또 실행합니다.</li>
</ul>



<p><strong>POSIX 팁:</strong> 이식성이 중요한 스크립트에서는 오직 <code><strong>;;</strong></code>만 사용하세요. <code><strong>;</strong></code> 하나만 쓰거나 다른 기호를 섞으면 구형 쉘에서 에러가 납니다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">if vs case: 언제 무엇을 쓸까?</h2>



<ul class="wp-block-list">
<li><strong><code>if</code> 문이 유리할 때</strong>: 숫자 크기 비교(<code>-gt</code>, <code>-lt</code>), 복잡한 논리 조합(<code>&amp;&amp;</code>, <code>||</code>), 파일 존재 여부 확인 등.</li>



<li><strong><code>case</code> 문이 유리할 때</strong>: 하나의 변수 값이 특정 문자열 패턴 중 무엇인지 분류할 때 (3개 이상의 분기라면 <code>case</code>를 강력 추천).</li>
</ul>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p><code>case</code> 문을 사용하면 스크립트가 훨씬 읽기 쉬워지고 구조가 명확해집니다. </p>



<p>특히 인자 처리나 사용자 응답 처리에서 <code>case</code>를 활용해 보세요. 여러분의 코드가 한층 더 전문가답게 보일 것입니다!</p>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-case-%eb%ac%b8/40629/">POSIX Shell: case 문</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/posix-shell-case-%eb%ac%b8/40629/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>POSIX Shell: 변수(Variables) &#038; 문자열(String)</title>
		<link>https://lycos7560.com/etc/posix-shell-%eb%b3%80%ec%88%98variables-%eb%ac%b8%ec%9e%90%ec%97%b4string/40627/</link>
					<comments>https://lycos7560.com/etc/posix-shell-%eb%b3%80%ec%88%98variables-%eb%ac%b8%ec%9e%90%ec%97%b4string/40627/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Tue, 12 May 2026 21:50:52 +0000</pubDate>
				<category><![CDATA[개인 공부 저장용]]></category>
		<category><![CDATA[기타]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[공부]]></category>
		<category><![CDATA[기초]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40627</guid>

					<description><![CDATA[<p>쉘 스크립트에서 변수는 별도의 선언(형식 지정) 없이 바로 사용할 수 있어 유연하지만, 그만큼 문법이 엄격한 부분도 있습니다. 특히 공백과 따옴표 사용법이 핵심입니다. 변수 선언과 사용 (Variables) Shell 변수는 선언 시 타입을 지정하지 않으며, 공백에 매우 민감합니다. 특수 변수 (Special Variables) 스크립트 실행 시 자동으로 할당되는 예약 변수들입니다. 변수 의미 예시 (./run.sh aix hacmp) $0 스크립트 [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-%eb%b3%80%ec%88%98variables-%eb%ac%b8%ec%9e%90%ec%97%b4string/40627/">POSIX Shell: 변수(Variables) &amp; 문자열(String)</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-dfed9df5      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#변수-선언과-사용-variables" class="uagb-toc-link__trigger">변수 선언과 사용 (Variables)</a><li class="uagb-toc__list"><a href="#특수-변수-special-variables" class="uagb-toc-link__trigger">특수 변수 (Special Variables)</a><li class="uagb-toc__list"><a href="#기본값-처리-default-values" class="uagb-toc-link__trigger">기본값 처리 (Default Values)</a><li class="uagb-toc__list"><a href="#패턴-제거-pattern-removal" class="uagb-toc-link__trigger">패턴 제거 (Pattern Removal)</a><li class="uagb-toc__list"><a href="#문자열-치환-및-대소문자-변환-bash-확장" class="uagb-toc-link__trigger">문자열 치환 및 대소문자 변환 (Bash 확장)</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#문자열-치환" class="uagb-toc-link__trigger">문자열 치환</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#대소문자-변환" class="uagb-toc-link__trigger">대소문자 변환</a></li></ul></li><li class="uagb-toc__list"><a href="#문자열-분리-ifs-활용" class="uagb-toc-link__trigger">문자열 분리 (IFS 활용)</a></ul></ol>					</div>
									</div>
				</div>
			


<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>쉘 스크립트에서 변수는 별도의 선언(형식 지정) 없이 바로 사용할 수 있어 유연하지만, 그만큼 문법이 엄격한 부분도 있습니다. </p>



<p>특히 <strong>공백</strong>과 <strong>따옴표</strong> 사용법이 핵심입니다.</p>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">변수 선언과 사용 (Variables)</h2>



<p>Shell 변수는 선언 시 타입을 지정하지 않으며, <strong>공백</strong>에 매우 민감합니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 선언: = 앞뒤 공백 금지 (필수!)
NAME="lycos7560" 
COUNT=42 

# 사용: $ 또는 ${}를 사용
echo "$NAME"       # 일반적인 사용
echo "${NAME}"     # 경계를 명확히 할 때 권장
echo "User_${NAME}_log" # 변수명 뒤에 문자가 붙을 때 필수</pre>



<ul class="wp-block-list">
<li><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 주의:</strong> <code>NAME = value</code>처럼 공백을 넣으면 시스템은 <code>NAME</code>을 변수가 아닌 <strong>명령어</strong>로 인식하여 에러(<code>command not found</code>)를 발생시킵니다</li>
</ul>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">특수 변수 (Special Variables)</h2>



<p>스크립트 실행 시 자동으로 할당되는 예약 변수들입니다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>변수</strong></td><td><strong>의미</strong></td><td><strong>예시 (./run.sh aix hacmp)</strong></td></tr></thead><tbody><tr><td><strong><code>$0</code></strong></td><td>스크립트 이름</td><td><code>./run.sh</code></td></tr><tr><td><strong><code>$1</code> ~ <code>$9</code></strong></td><td>위치 매개변수 (인자)</td><td><code>$1</code>은 <code>aix</code>, <code>$2</code>는 <code>hacmp</code></td></tr><tr><td><strong><code>$#</code></strong></td><td>인자 개수</td><td><code>2</code></td></tr><tr><td><strong><code>$@</code></strong></td><td>모든 인자 (각각 분리)</td><td><code>"aix" "hacmp"</code></td></tr><tr><td><strong><code>$?</code></strong></td><td>마지막 명령어 종료 코드</td><td><code>0</code>(성공) 또는 <code>1~255</code>(실패)</td></tr><tr><td><strong><code>$$</code></strong></td><td>현재 프로세스 PID</td><td><code>1234</code></td></tr></tbody></table></figure>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">기본값 처리 (Default Values)</h2>



<p>변수가 비어있을 때를 대비한 방어적 코딩 기법입니다.</p>



<ul class="wp-block-list">
<li><strong><code>${VAR:-default}</code></strong>: <code>VAR</code>이 비어있으면 <code>default</code>를 사용 (변수 값은 유지)</li>



<li><strong><code>${VAR:=default}</code></strong>: <code>VAR</code>이 비어있으면 <code>default</code>를 <strong>변수에 대입</strong></li>



<li><strong><code>${VAR:?message}</code></strong>: <code>VAR</code>이 비어있으면 메시지 출력 후 <strong>스크립트 종료</strong></li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 예시
HOST=""
printf "Connecting to %s...\n" "${HOST:-localhost}"  # localhost 출력</pre>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">패턴 제거 (Pattern Removal)</h2>



<p>파일 경로에서 파일명만 추출하거나 확장자를 뗄 때 가장 많이 사용하는 강력한 기능입니다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>문법</strong></td><td><strong>설명</strong></td><td><strong>기억법</strong></td></tr></thead><tbody><tr><td><strong><code>${VAR#패턴}</code></strong></td><td>앞에서부터 <strong>최단</strong> 일치 제거</td><td><code>#</code>은 키보드 왼쪽(앞), 하나는 짧게</td></tr><tr><td><strong><code>${VAR##패턴}</code></strong></td><td>앞에서부터 <strong>최장</strong> 일치 제거</td><td><code>##</code>은 길게</td></tr><tr><td><strong><code>${VAR%패턴}</code></strong></td><td>뒤에서부터 <strong>최단</strong> 일치 제거</td><td><code>%</code>는 키보드 오른쪽(뒤), 하나는 짧게</td></tr><tr><td><strong><code>${VAR%%패턴}</code></strong></td><td>뒤에서부터 <strong>최장</strong> 일치 제거</td><td><code>%%</code>는 길게</td></tr></tbody></table></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">FILE="/var/log/syslog.tar.gz"

echo "${FILE##*/}"  # syslog.tar.gz (경로 제거)
echo "${FILE%.*}"   # /var/log/syslog.tar (최종 확장자 제거)
echo "${FILE%%.*}"  # /var/log/syslog (모든 확장자 제거)
echo "${FILE%/*}"   # /var/log (디렉토리만 추출)

[결과]
$ ./01_hello.sh start
syslog.tar.gz
/var/log/syslog.tar
/var/log/syslog
/var/log</pre>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">문자열 치환 및 대소문자 변환 (Bash 확장)</h2>



<p><strong>주의:</strong> 아래 기능들은 <strong>Bash 4.0 이상</strong>에서 지원됩니다. </p>



<p>구형 AIX의 <code>/bin/sh</code>에서는 작동하지 않을 수 있으니 환경을 확인하세요.</p>



<h3 class="wp-block-heading">문자열 치환</h3>



<ul class="wp-block-list">
<li><code>${STR/old/new}</code>: 첫 번째 일치 항목만 치환</li>



<li><code>${STR//old/new}</code>: 모든 일치 항목 치환</li>
</ul>



<h3 class="wp-block-heading">대소문자 변환</h3>



<ul class="wp-block-list">
<li><code>${STR^^}</code>: 전체 대문자</li>



<li><code>${STR,,}</code>: 전체 소문자</li>
</ul>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">문자열 분리 (IFS 활용)</h2>



<p><code>IFS</code>(Internal Field Separator)는 쉘이 단어를 나누는 기준 문자입니다. </p>



<p>이를 변경하여 CSV 형태의 데이터를 쉽게 분리할 수 있습니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 콜론(:)으로 구분된 데이터 파싱
LINE="hostname:192.168.1.1:8080"
IFS=":" read -r HOST IP PORT &lt;&lt; EOF
$LINE
EOF

printf "Host: %s, IP: %s, Port: %s\n" "$HOST" "$IP" "$PORT"</pre>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>POSIX 표준 변수 처리(<code>${#}</code>, <code>${%}</code>)는 매우 빠르고 효율적입니다. </p>



<p><code>sed</code>나 <code>awk</code> 같은 외부 명령어를 호출하지 않고도 쉘 자체 기능만으로 문자열을 처리하는 습관을 들이면 스크립트의 성능이 비약적으로 향상됩니다!</p>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-%eb%b3%80%ec%88%98variables-%eb%ac%b8%ec%9e%90%ec%97%b4string/40627/">POSIX Shell: 변수(Variables) &amp; 문자열(String)</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/posix-shell-%eb%b3%80%ec%88%98variables-%eb%ac%b8%ec%9e%90%ec%97%b4string/40627/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>POSIX Shell: 표준 함수(Function)</title>
		<link>https://lycos7560.com/etc/posix-shell-%ed%91%9c%ec%a4%80-%ed%95%a8%ec%88%98function/40616/</link>
					<comments>https://lycos7560.com/etc/posix-shell-%ed%91%9c%ec%a4%80-%ed%95%a8%ec%88%98function/40616/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Tue, 12 May 2026 21:27:29 +0000</pubDate>
				<category><![CDATA[개인 공부 저장용]]></category>
		<category><![CDATA[기타]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[공부]]></category>
		<category><![CDATA[기초]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40616</guid>

					<description><![CDATA[<p>스크립트의 규모가 커지면 중복되는 코드를 줄이기 위해 함수(Function)를 사용해야 합니다. POSIX 표준을 따르면서 어디서나 잘 작동하는 함수 작성법을 알아봅니다. 기본 문법 가장 중요한 차이점은 function이라는 키워드를 쓰지 않는다는 것입니다. 인자 전달 (Arguments) 함수로 값을 보낼 때는 별도의 파라미터 이름을 정의하지 않고, 스크립트 실행 인자와 똑같이 위치 매개변수($1, $2, &#8230;)를 사용합니다. 변수 의미 $1, $2 첫 [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-%ed%91%9c%ec%a4%80-%ed%95%a8%ec%88%98function/40616/">POSIX Shell: 표준 함수(Function)</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-19f9e4de      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#기본-문법" class="uagb-toc-link__trigger">기본 문법</a><li class="uagb-toc__list"><a href="#인자-전달-arguments" class="uagb-toc-link__trigger">인자 전달 (Arguments)</a><li class="uagb-toc__list"><a href="#지역-변수-local-variables-주의사항" class="uagb-toc-link__trigger">지역 변수 (Local Variables) 주의사항</a><li class="uagb-toc__list"><a href="#반환값-return-value" class="uagb-toc-link__trigger">반환값 (Return Value)</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#return-종료-상태-코드-반환" class="uagb-toc-link__trigger">① return: 종료 상태 코드 반환</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#printfecho-데이터-결과-반환" class="uagb-toc-link__trigger">② printf/echo: 데이터 결과 반환</a></li></ul></li><li class="uagb-toc__list"><a href="#로깅-함수-만들기" class="uagb-toc-link__trigger">로깅 함수 만들기</a><li class="uagb-toc__list"><a href="#핵심-요약-checklist" class="uagb-toc-link__trigger">핵심 요약 (Checklist)</a><li class="uagb-toc__list"><a href="#주의사항" class="uagb-toc-link__trigger">주의사항</a></ul></ol>					</div>
									</div>
				</div>
			


<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<p>스크립트의 규모가 커지면 중복되는 코드를 줄이기 위해 함수(Function)를 사용해야 합니다. </p>



<p>POSIX 표준을 따르면서 어디서나 잘 작동하는 함수 작성법을 알아봅니다.</p>



<h2 class="wp-block-heading">기본 문법</h2>



<p>가장 중요한 차이점은 <strong><code>function</code>이라는 키워드를 쓰지 않는다</strong>는 것입니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># POSIX 표준 방식 (권장 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" />)
함수이름() {
    # 실행할 내용
}

# Bash 전용 방식 (POSIX에서는 지양 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" />)
# function 함수이름 { ... }</pre>



<ul class="wp-block-list">
<li><strong>함수 정의</strong>: 반드시 함수를 <strong>호출하기 전</strong>에 먼저 정의되어 있어야 합니다. (보통 스크립트 상단에 배치)</li>



<li><strong>호출</strong>: 함수 이름만 적으면 실행됩니다. (괄호 <code>()</code> 없이 이름만 사용)</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">인자 전달 (Arguments)</h2>



<p>함수로 값을 보낼 때는 별도의 파라미터 이름을 정의하지 않고, 스크립트 실행 인자와 똑같이 위치 매개변수(<code>$1</code>, <code>$2</code>, &#8230;)를 사용합니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">greet() {
    printf "안녕하세요, %s님!\n" "$1"
}

greet "홍길동"  # $1에 "홍길동"이 전달됨</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>변수</strong></td><td><strong>의미</strong></td></tr></thead><tbody><tr><td><code>$1</code>, <code>$2</code></td><td>첫 번째, 두 번째 인자</td></tr><tr><td><code>$#</code></td><td>함수에 전달된 인자의 총 개수</td></tr><tr><td><code>$@</code></td><td>전달된 모든 인자 목록</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">지역 변수 (Local Variables) 주의사항</h2>



<p>이 부분이 POSIX 표준의 가장 큰 제약사항입니다.</p>



<ul class="wp-block-list">
<li><strong>Bash</strong>:</li>
</ul>



<p><code>local</code> 키워드를 사용하여 함수 내부에서만 쓰는 변수를 만들 수 있습니다.</p>



<ul class="wp-block-list">
<li><strong>POSIX (sh)</strong>: </li>
</ul>



<p>표준에는 <strong><code>local</code> 키워드가 없습니다.</strong> </p>



<p>함수 안에서 선언한 변수도 기본적으로 전역 변수(Global)가 되어 스크립트 전체에 영향을 줍니다.</p>



<p><strong>해결책:</strong> 함수 내에서만 쓰는 변수는 <code>_var_name</code>처럼 앞에 언더바를 붙이거나, 이름이 겹치지 않게 주의해서 지어야 합니다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">반환값 (Return Value)</h2>



<p>함수의 실행 결과를 처리하는 방법은 두 가지입니다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>구분</strong></td><td><strong>종료 상태 코드 (Exit Status)</strong></td><td><strong>표준 출력 (Standard Output)</strong></td></tr></thead><tbody><tr><td><strong>데이터 타입</strong></td><td>0 ~ 255 사이의 <strong>정수</strong></td><td><strong>문자열</strong> (텍스트 데이터)</td></tr><tr><td><strong>확인 방법</strong></td><td><code>$?</code> 변수로 확인</td><td><code>$(함수이름)</code> (명령어 치환)으로 캡처</td></tr><tr><td><strong>주 용도</strong></td><td>성공(0) 또는 실패(그 외) 판별</td><td>처리된 결과값 전달 (이름, 날짜 등)</td></tr><tr><td><strong>비유</strong></td><td>&#8220;내 일 잘 끝냈어!&#8221; (결과 보고서의 합격/불합격 도장)</td><td>&#8220;내가 만든 결과물이야.&#8221; (결과 보고서의 내용물)</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">① <code>return</code>: 종료 상태 코드 반환</h3>



<p>숫자(0~255)만 반환할 수 있으며, 주로 성공(0)과 실패(그 외)를 알리는 용도입니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">is_file_exist() {
    if [ -f "$1" ]; then
        return 0 # 성공
    else
        return 1 # 실패
    fi
}</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">② <code>printf</code>/<code>echo</code>: 데이터 결과 반환</h3>



<p>문자열이나 계산 결과 자체를 받아야 할 때는 출력문을 이용하고 명령어 치환(<code>$()</code>)으로 낚아챕니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">get_date() {
    printf "%s" "$(date +%Y-%m-%d)"
}

TODAY=$(get_date)
printf "오늘 날짜: %s\n" "$TODAY"</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>간단한 예시</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

get_user_status() {
    _USER_NAME="TestUser1"  # 실제 사용자 이름을 여기에 설정
    
    if [ "$_USER_NAME" = "TestUser" ]; then
        # 1. 표준 출력으로 문자열을 내보냄 (반환 문자열)
        printf "Active User"
        # 2. 종료 코드로 성공을 알림 (명령어 마지막 실행 결과가 0)
        return 0
    else
        printf "Unknown"
        return 1
    fi
}

# 실행 및 데이터 캡처
STATUS_TEXT=$(get_user_status)  # "Active User"가 변수에 저장됨 , 출력 문자열($()): 함수가 무슨 데이터를 만들었는지 알려줌 (실제 값)
STATUS_CODE=$?                  # 0이 변수에 저장됨

printf "문자열 결과: %s\n" "$STATUS_TEXT"
printf "상태 코드: %d\n" "$STATUS_CODE"</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">로깅 함수 만들기</h2>



<p>실제 프로젝트에서 유용하게 쓸 수 있는 메시지 출력 함수 예시입니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

# 로깅 함수 정의
log_message() {
    _LEVEL="$1"
    _MSG="$2"
    _TIME=$(date '+%H:%M:%S')

    # 형식: [시간] [로그레벨] 메시지
    printf "[%s] [%s] %s\n" "$_TIME" "$_LEVEL" "$_MSG"
}

# 함수 호출
log_message "INFO" "애플리케이션을 시작합니다."
log_message "WARN" "설정 파일이 없습니다. 기본값을 사용합니다."


if [ "$?" -eq 0 ]; then                                  # 상태 코드($?): 마지막 함수가 어떻게 끝났는지 알려줌 (성공/실패)
    log_message "SUCCESS" "작업이 성공적으로 끝났습니다."
fi</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">핵심 요약 (Checklist)</h2>



<ul class="wp-block-list">
<li><strong><code>function</code> 키워드는 빼자</strong>: 그냥 <code>name() { ... }</code> 형식을 사용하세요.</li>



<li><strong><code>local</code>은 표준이 아니다</strong>: 변수 이름 충돌에 주의하세요.</li>



<li><strong>인자는 <code>$1</code>, <code>$2</code>로</strong>: 함수 호출 시 옆에 나열하면 됩니다.</li>



<li><strong>복잡한 결과는 <code>printf</code>로</strong>: 값을 돌려받고 싶을 땐 출력을 이용하세요.</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">주의사항</h2>



<p> &#8220;출력되는 모든 것&#8221; : 함수 안에서 <code>printf</code>나 <code>echo</code>로 찍는 <strong>모든 내용</strong>은 밖에서 <code>$( )</code>로 감싸는 순간 하나의 <strong>반환 문자열</strong>로 합쳐집니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">my_func() {
    printf "Hello "
    printf "World"
}

RESULT=$(my_func)
# RESULT에는 "Hello World"가 들어갑니다.</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><code>$?</code> 사용 시 주의 : <code>$?</code>는 <strong>바로 직전 명령의 상태코드</strong>라서 즉시 변수에 저장하는 습관이 중요해요.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">STATUS_CODE=$?   # 이 줄은 OK

# 하지만 이런 경우 주의!
some_func
echo "결과 출력"   # 이 줄이 실행되면 $?가 덮어씌워짐
echo $?            # some_func의 코드가 아님!</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><code>$()</code>와 서브쉘 비용</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">RESULT=$(my_func)  # 서브쉘이 생성됨 → 성능 비용 있음</pre>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-%ed%91%9c%ec%a4%80-%ed%95%a8%ec%88%98function/40616/">POSIX Shell: 표준 함수(Function)</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/posix-shell-%ed%91%9c%ec%a4%80-%ed%95%a8%ec%88%98function/40616/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>POSIX Shell: if</title>
		<link>https://lycos7560.com/etc/posix-shell-if/40609/</link>
					<comments>https://lycos7560.com/etc/posix-shell-if/40609/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Tue, 12 May 2026 21:11:09 +0000</pubDate>
				<category><![CDATA[개인 공부 저장용]]></category>
		<category><![CDATA[기타]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[공부]]></category>
		<category><![CDATA[기초]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40609</guid>

					<description><![CDATA[<p>쉘 스크립트에서 if문은 프로그램의 흐름을 결정하는 핵심입니다. 하지만 #!/bin/sh 환경에서는 우리가 흔히 쓰는 Bash 전용 문법([[ ]])을 사용할 수 없습니다. 어디서나 돌아가는 견고한 스크립트를 위한 POSIX 표준 if 문법을 정리합니다. 기본 구조 가장 중요한 것은 if, then, fi의 짝을 맞추는 것입니다. 주의: [ 뒤와 ] 앞에는 반드시 공백이 있어야 합니다. [는 사실 test라는 이름의 명령어이기 [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-if/40609/">POSIX Shell: if</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-9a16a507      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#기본-구조" class="uagb-toc-link__trigger">기본 구조</a><li class="uagb-toc__list"><a href="#문자열-비교-string-comparison" class="uagb-toc-link__trigger">문자열 비교 (String Comparison)</a><li class="uagb-toc__list"><a href="#숫자-비교-integer-comparison" class="uagb-toc-link__trigger">숫자 비교 (Integer Comparison)</a><li class="uagb-toc__list"><a href="#파일-상태-확인-file-test" class="uagb-toc-link__trigger">파일 상태 확인 (File Test)</a><li class="uagb-toc__list"><a href="#논리-연산-and-or" class="uagb-toc-link__trigger">논리 연산 (AND, OR)</a><li class="uagb-toc__list"><a href="#사용-예시" class="uagb-toc-link__trigger">사용 예시</a></ol>					</div>
									</div>
				</div>
			


<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<p>쉘 스크립트에서 <code>if</code>문은 프로그램의 흐름을 결정하는 핵심입니다. </p>



<p>하지만 <code>#!/bin/sh</code> 환경에서는 우리가 흔히 쓰는 Bash 전용 문법(<code>[[ ]]</code>)을 사용할 수 없습니다. </p>



<p>어디서나 돌아가는 견고한 스크립트를 위한 <strong>POSIX 표준 if 문법</strong>을 정리합니다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">기본 구조</h2>



<p>가장 중요한 것은 <strong><code>if</code></strong>, <strong><code>then</code></strong>, <code><strong>fi</strong></code>의 짝을 맞추는 것입니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">if [ 조건식 ]; then
    # 조건이 참(True)일 때 실행
elif [ 조건식 ]; then
    # 앞의 조건이 거짓이고, 현재 조건이 참일 때 실행
else
    # 모든 조건이 거짓일 때 실행
fi</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>주의:</strong> <code>[</code> 뒤와 <code>]</code> 앞에는 반드시 <strong>공백</strong>이 있어야 합니다. <code>[</code>는 사실 <code>test</code>라는 이름의 명령어이기 때문입니다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">문자열 비교 (String Comparison)</h2>



<p>문자열을 비교할 때는 <code>=</code>와 <code>!=</code>를 사용합니다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>조건식</strong></td><td><strong>설명</strong></td></tr></thead><tbody><tr><td><code>[ "$A" = "$B" ]</code></td><td>A와 B가 같으면 참</td></tr><tr><td><code>[ "$A" != "$B" ]</code></td><td>A와 B가 다르면 참</td></tr><tr><td><code>[ -z "$A" ]</code></td><td>문자열 A의 길이가 0이면 참 (Empty)</td></tr><tr><td><code>[ -n "$A" ]</code></td><td>문자열 A의 길이가 0이 아니면 참 (Not Empty)</td></tr></tbody></table></figure>



<p><strong>핵심 팁:</strong> 변수는 반드시 <strong>쌍따옴표(<code>" "</code>)</strong>로 감싸세요. </p>



<p>변수가 비어있을 경우 발생할 수 있는 구문 오류를 방지해줍니다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">숫자 비교 (Integer Comparison)</h2>



<p>숫자는 부등호(<code>&lt;</code>, <code>></code>) 대신 <strong>문자 약어</strong>를 사용합니다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>조건식</strong></td><td><strong>의미</strong></td><td><strong>Full Name</strong></td></tr></thead><tbody><tr><td><code>[ "$A" -eq "$B" ]</code></td><td>같음</td><td><strong>Eq</strong>ual</td></tr><tr><td><code>[ "$A" -ne "$B" ]</code></td><td>다름</td><td><strong>N</strong>ot <strong>E</strong>qual</td></tr><tr><td><code>[ "$A" -gt "$B" ]</code></td><td>초과</td><td><strong>G</strong>reater <strong>T</strong>han</td></tr><tr><td><code>[ "$A" -ge "$B" ]</code></td><td>이상</td><td><strong>G</strong>reater or <strong>E</strong>qual</td></tr><tr><td><code>[ "$A" -lt "$B" ]</code></td><td>미만</td><td><strong>L</strong>ess <strong>T</strong>han</td></tr><tr><td><code>[ "$A" -le "$B" ]</code></td><td>이하</td><td><strong>L</strong>ess or <strong>E</strong>qual</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">파일 상태 확인 (File Test)</h2>



<p>쉘 스크립트에서 가장 많이 쓰이는 강력한 기능입니다.</p>



<ul class="wp-block-list">
<li><code>[ -f "file" ]</code>: 일반 <strong>파일</strong>이 존재하면 참</li>



<li><code>[ -d "dir" ]</code>: <strong>디렉토리</strong>가 존재하면 참</li>



<li><code>[ -e "path" ]</code>: 파일이든 디렉토리든 <strong>존재</strong>만 하면 참</li>



<li><code>[ -r "file" ]</code>: 읽기 권한이 있으면 참</li>



<li><code>[ -x "file" ]</code>: 실행 권한이 있으면 참</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">논리 연산 (AND, OR)</h2>



<p>여러 조건을 조합할 때 POSIX에서는 두 가지 방법을 씁니다.</p>



<p><strong><code>-a</code> (AND), <code>-o</code> (OR)</strong>: 하나의 <code>[ ]</code> 안에서 사용</p>



<ul class="wp-block-list">
<li><code>if [ "$A" = "1" -a "$B" = "2" ]</code></li>
</ul>



<p><strong><code>&amp;&amp;</code>, <code>||</code> 활용</strong>: 여러 개의 <code>[ ]</code>를 연결 (<strong>더 권장됨</strong>)</p>



<ul class="wp-block-list">
<li><code>if [ "$A" = "1" ] &amp;&amp; [ "$B" = "2" ]</code></li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">사용 예시</h2>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

APP_NAME="TestApp"
CONFIG_FILE="./config.conf"
DEBUG_MODE="ON"

printf "시스템 체크를 시작합니다...\n"

# 1. 설정 파일 존재 여부 체크 (파일 테스트)
if [ -f "$CONFIG_FILE" ]; then
    printf "[OK] 설정 파일을 찾았습니다.\n"
else
    printf "[Error] %s 파일이 없습니다.\n" "$CONFIG_FILE"
    # exit 1  # 실제 스크립트라면 여기서 종료 가능
fi

# 2. 디버그 모드 확인 (문자열 비교)
if [ "$DEBUG_MODE" = "ON" ]; then
    printf "[Log] 디버그 모드가 활성화되어 있습니다.\n"
fi

# 3. 인자 개수 확인 (숫자 비교)
# $#는 스크립트에 전달된 인자의 개수입니다.
if [ "$#" -lt 1 ]; then
    printf "사용법: %s [start|stop]\n" "$0"
else
    if [ "$1" = "start" ]; then
        printf "%s을 시작합니다...\n" "$APP_NAME"
    elif [ "$1" = "stop" ]; then
        printf "%s을 중지합니다...\n" "$APP_NAME"
    else
        printf "알 수 없는 명령입니다: %s\n" "$1"
    fi
fi





$ ./01_hello.sh start
시스템 체크를 시작합니다...
[OK] 설정 파일을 찾았습니다.
[Log] 디버그 모드가 활성화되어 있습니다.
TestApp을 시작합니다...</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/posix-shell-if/40609/">POSIX Shell: if</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/posix-shell-if/40609/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>POSIX Shell: printf</title>
		<link>https://lycos7560.com/etc/posix-bash-printf/40604/</link>
					<comments>https://lycos7560.com/etc/posix-bash-printf/40604/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Tue, 12 May 2026 20:50:44 +0000</pubDate>
				<category><![CDATA[개인 공부 저장용]]></category>
		<category><![CDATA[기타]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[공부]]></category>
		<category><![CDATA[기초]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40604</guid>

					<description><![CDATA[<p>쉘 스크립트를 작성할 때 단순히 메시지를 출력하기 위해 echo를 자주 사용합니다. 하지만 스크립트가 복잡해지고 여러 환경에서의 이식성(Portability)이 중요해지면 printf를 사용하는 것이 개발자 정신 건강에 좋다. echo 대신 printf? 특징 echo printf 표준 준수 시스템/쉘마다 동작이 다름 (비표준) POSIX 표준 — 어디서나 동일하게 동작 제어 능력 단순 출력에 최적화 포맷 지정자를 통한 세밀한 제어 가능 개행(줄바꿈) [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/posix-bash-printf/40604/">POSIX Shell: printf</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-db47f186      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#echo-대신-printf" class="uagb-toc-link__trigger">echo 대신 printf?</a><li class="uagb-toc__list"><a href="#기본-문법" class="uagb-toc-link__trigger">기본 문법</a><li class="uagb-toc__list"><a href="#핵심-포맷-지정자-format-specifiers" class="uagb-toc-link__trigger">핵심 포맷 지정자 (Format Specifiers)</a><li class="uagb-toc__list"><a href="#고급-제어-너비-정렬-정밀도" class="uagb-toc-link__trigger">고급 제어: 너비, 정렬, 정밀도</a><li class="uagb-toc__list"><a href="#실전-예제-코드" class="uagb-toc-link__trigger">실전 예제 코드</a><li class="uagb-toc__list"><a href="#이스케이프-시퀀스-escape-sequences" class="uagb-toc-link__trigger">이스케이프 시퀀스 (Escape Sequences)</a></ol>					</div>
									</div>
				</div>
			


<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p>쉘 스크립트를 작성할 때 단순히 메시지를 출력하기 위해 <code>echo</code>를 자주 사용합니다. </p>



<p>하지만 스크립트가 복잡해지고 여러 환경에서의 이식성(Portability)이 중요해지면 <code>printf</code>를 사용하는 것이 개발자 정신 건강에 좋다.</p>



<h2 class="wp-block-heading">echo 대신 printf?</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>특징</strong></td><td><strong>echo</strong></td><td><strong>printf</strong></td></tr></thead><tbody><tr><td><strong>표준 준수</strong></td><td>시스템/쉘마다 동작이 다름 (비표준)</td><td><strong>POSIX 표준</strong> — 어디서나 동일하게 동작</td></tr><tr><td><strong>제어 능력</strong></td><td>단순 출력에 최적화</td><td>포맷 지정자를 통한 세밀한 제어 가능</td></tr><tr><td><strong>개행(줄바꿈)</strong></td><td>자동으로 줄을 바꿈</td><td><code>\n</code>을 명시해야 함 (의도적 제어 가능)</td></tr><tr><td><strong>신뢰도</strong></td><td><code>-e</code>, <code>-n</code> 옵션 등이 환경마다 다름</td><td>일관된 결과 보장 (이식성 높음)</td></tr></tbody></table></figure>



<p><strong>결론:</strong> 단순한 확인용 출력은 <code>echo</code>가 편하지만, 표(Table)를 만들거나 진법 변환, 정교한 텍스트 배치가 필요하다면 <code>printf</code>를 사용하는 것이 좋다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">기본 문법</h2>



<p><code>printf</code>는 포맷 문자열(Format String)을 먼저 정의하고, 그 뒤에 들어갈 인자(Arguments)를 순서대로 나열하는 문법 체계를 가지고 있다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">printf "포맷문자열" [인자1] [인자2] ...</pre>



<ul class="wp-block-list">
<li><strong>특징</strong>: 인자의 개수가 포맷 지정자보다 많으면, 포맷 문자열을 <strong>반복</strong>해서 적용합니다.</li>



<li><strong>주의</strong>: 자동으로 줄바꿈을 하지 않으므로 문자열 끝에 <code>\n</code>을 붙여야 합니다</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">핵심 포맷 지정자 (Format Specifiers)</h2>



<p>인자의 데이터 타입에 맞는 지정자를 사용해야 합니다.</p>



<ul class="wp-block-list">
<li><code>%s</code>: <strong>S</strong>tring (문자열)</li>



<li><code>%d</code>: <strong>D</strong>ecimal (10진수 정수)</li>



<li><code>%f</code>: <strong>F</strong>loat (부동소수점 실수)</li>



<li><code>%x</code>: He<strong>x</strong>adecimal (16진수 소문자)</li>



<li><code>%o</code>: <strong>O</strong>ctal (8진수)</li>



<li><code>%%</code>: <code>%</code> 기호 자체를 출력</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">고급 제어: 너비, 정렬, 정밀도</h2>



<p><code>printf</code>의 진가는 데이터를 예쁘게 정렬할 때 나타납니다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>포맷</strong></td><td><strong>설명</strong></td></tr></thead><tbody><tr><td><code>%10s</code></td><td>최소 10자 너비 확보, <strong>오른쪽</strong> 정렬</td></tr><tr><td><code>%-10s</code></td><td>최소 10자 너비 확보, <strong>왼쪽</strong> 정렬</td></tr><tr><td><code>%.2f</code></td><td>소수점 아래 <strong>2자리</strong>까지 출력</td></tr><tr><td><code>%8.2f</code></td><td>전체 8칸 확보 후 소수점 2자리 출력</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">실전 예제 코드</h2>



<p>기본 출력 및 진법 변환</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 이름과 나이 출력
printf "이름: %s, 나이: %d\n" "Kim" 30

# 10진수 255를 16진수로 변환 (결과: 0xff)
printf "16진수 변환: 0x%x\n" 255

# 퍼센트 기호 출력 (결과: 75%)
printf "CPU 사용률: %d%%\n" 75</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>데이터 표(Table) 만들기</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#!/bin/sh

# 헤더 출력
printf "%-10s %5s %8s\n" "이름" "점수" "등급"
printf "--------------------------\n"

# 데이터 출력
printf "%-10s %5d %8s\n" "홍길동" 95 "A"
printf "%-10s %5d %8s\n" "김철수" 82 "B"
printf "%-10s %5d %8s\n" "이영희" 100 "A+"</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">이스케이프 시퀀스 (Escape Sequences)</h2>



<p>문자열 내에서 특수 기능을 수행하는 기호들입니다.</p>



<ul class="wp-block-list">
<li><code>\n</code>: 줄바꿈 (Newline)</li>



<li><code>\t</code>: 탭 (Tab)</li>



<li><code>\\</code>: 백슬래시(<code>\</code>) 자체 출력</li>



<li><code>\0NNN</code>: 8진수 숫자로 지정된 ASCII 문자 출력</li>
</ul>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/posix-bash-printf/40604/">POSIX Shell: printf</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/posix-bash-printf/40604/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>#include 지시자</title>
		<link>https://lycos7560.com/etc/include-%ec%a7%80%ec%8b%9c%ec%9e%90/40565/</link>
					<comments>https://lycos7560.com/etc/include-%ec%a7%80%ec%8b%9c%ec%9e%90/40565/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Sun, 05 Apr 2026 18:33:13 +0000</pubDate>
				<category><![CDATA[C++/CPP]]></category>
		<category><![CDATA[개인 공부 저장용]]></category>
		<category><![CDATA[기타]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[공부]]></category>
		<category><![CDATA[기초]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40565</guid>

					<description><![CDATA[<p>C 언어와 C++에서 #include는 소스 코드 파일의 가장 윗부분에서 흔히 볼 수 있는 전처리기 지시자(Preprocessor Directive)입니다. 1. #include의 핵심 역할 #include는 한마디로 &#8220;복사해서 붙여넣기&#8221;입니다. 컴파일러가 실제 코드를 번역하기 전(전처리 단계), 지정한 파일의 내용을 #include 문장이 있는 그 자리에 통째로 가져와서 삽입합니다. 2. 사용법에 따른 차이 ( &#60; &#62; vs " " ) #include를 사용할 때 [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/include-%ec%a7%80%ec%8b%9c%ec%9e%90/40565/">#include 지시자</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-537dce7c      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#1-include의-핵심-역할" class="uagb-toc-link__trigger">1. #include의 핵심 역할</a><li class="uagb-toc__list"><a href="#2-사용법에-따른-차이-vs" class="uagb-toc-link__trigger">2. 사용법에 따른 차이 ( &lt; &gt; vs &quot; &quot; )</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#꺽쇠-괄호" class="uagb-toc-link__trigger">① &lt; &gt; (꺽쇠 괄호)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#큰따옴표" class="uagb-toc-link__trigger">② &quot; &quot; (큰따옴표)</a></li></ul></li><li class="uagb-toc__list"><a href="#3-왜-헤더-파일을-포함해야-할까" class="uagb-toc-link__trigger">3. 왜 헤더 파일을 포함해야 할까?</a><li class="uagb-toc__list"><a href="#4-주의사항-중복-포함-방지" class="uagb-toc-link__trigger">4. 주의사항: 중복 포함 방지</a><li class="uagb-toc__list"><a href="#5-자주-사용하는-표준-라이브러리-헤더-목록-c" class="uagb-toc-link__trigger">5. 자주 사용하는 표준 라이브러리 헤더 목록 (c)</a><li class="uagb-toc__list"><a href="#요약" class="uagb-toc-link__trigger"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 요약</a></ul></ol>					</div>
									</div>
				</div>
			


<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>C 언어와 C++에서 <code>#include</code>는 소스 코드 파일의 가장 윗부분에서 흔히 볼 수 있는 전처리기 지시자(Preprocessor Directive)입니다. </p>



<h2 class="wp-block-heading">1. <code>#include</code>의 핵심 역할</h2>



<p><code>#include</code>는 한마디로 <strong>&#8220;복사해서 붙여넣기&#8221;</strong>입니다. </p>



<p>컴파일러가 실제 코드를 번역하기 전(전처리 단계), 지정한 파일의 내용을 <code>#include</code> 문장이 있는 그 자리에 통째로 가져와서 삽입합니다.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="644" height="299" src="https://lycos7560.com/wp-content/uploads/2026/04/image.png" alt="" class="wp-image-40566" srcset="https://lycos7560.com/wp-content/uploads/2026/04/image.png 644w, https://lycos7560.com/wp-content/uploads/2026/04/image-300x139.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)"/>



<h2 class="wp-block-heading">2. 사용법에 따른 차이 ( <code>&lt; &gt;</code> vs <code>" "</code> )</h2>



<p><code>#include</code>를 사용할 때 괄호의 모양에 따라 파일을 찾는 위치가 달라집니다.</p>



<h3 class="wp-block-heading">① <code>&lt; &gt;</code> (꺽쇠 괄호)</h3>



<ul class="wp-block-list">
<li><strong>사용 예:</strong> <code>#include &lt;stdio.h&gt;</code></li>



<li><strong>설명:</strong> 시스템의 <strong>표준 라이브러리 경로</strong>에서 파일을 찾습니다.</li>



<li><strong>대상:</strong> 컴파일러 설치 시 기본적으로 제공되는 표준 헤더 파일들을 불러올 때 사용합니다.</li>
</ul>



<h3 class="wp-block-heading">② <code>" "</code> (큰따옴표)</h3>



<ul class="wp-block-list">
<li><strong>사용 예:</strong> <code>#include "my_header.h"</code></li>



<li><strong>설명:</strong> <strong>현재 작업 중인 디렉토리(소스 파일이 있는 곳)</strong>에서 먼저 파일을 찾습니다. 만약 거기서 못 찾으면 시스템 표준 경로를 뒤집니다.</li>



<li><strong>대상:</strong> 개발자가 직접 만든 헤더 파일을 불러올 때 주로 사용합니다.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)"/>



<h2 class="wp-block-heading">3. 왜 헤더 파일을 포함해야 할까?</h2>



<p><code>printf</code>나 <code>scanf</code> 같은 함수를 쓸 수 있는 이유는 그 함수들의 <strong>선언(Declaration)</strong>이 <code>stdio.h</code>라는 파일 안에 들어있기 때문입니다.</p>



<ul class="wp-block-list">
<li>컴파일러는 함수를 만나면 &#8220;이 함수가 어떻게 생겼는지(매개변수, 반환 타입 등)&#8221;를 알아야 합니다.</li>



<li>직접 모든 함수를 정의하기엔 양이 너무 많으므로, 미리 정의된 헤더 파일을 <code>#include</code>로 불러와서 정보를 제공하는 것입니다.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)"/>



<h2 class="wp-block-heading">4. 주의사항: 중복 포함 방지</h2>



<p>대규모 프로젝트에서는 여러 파일이 서로를 참조하다가 똑같은 헤더 파일을 여러 번 <code>#include</code> 하는 상황이 발생할 수 있습니다. </p>



<p>이는 정의 중복 에러를 일으키므로, 보통 다음과 같은 기법을 사용합니다.</p>



<ul class="wp-block-list">
<li><strong>Header Guard:</strong>C<code>#ifndef MY_HEADER_H #define MY_HEADER_H // 코드 내용 #endif</code></li>



<li><strong>pragma once:</strong>C<code>#pragma once // 코드 내용</code></li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#ifndef MY_HEADER_H
#define MY_HEADER_H

/* 헤더 파일 내용 */
void say_hello();

#endif</pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)"/>



<h2 class="wp-block-heading">5. 자주 사용하는 표준 라이브러리 헤더 목록 (c)</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">헤더 파일</th><th class="has-text-align-left" data-align="left">포함 내용</th><th class="has-text-align-left" data-align="left">대표 함수</th></tr></thead><tbody><tr><td>&lt;stdio.h&gt;</td><td>표준 입출력</td><td>printf, scanf, fopen</td></tr><tr><td>&lt;stdlib.h&gt;</td><td>메모리·변환·난수</td><td>malloc, free, rand</td></tr><tr><td>&lt;string.h&gt;</td><td>문자열 처리</td><td>strcpy, strlen, strcmp</td></tr><tr><td>&lt;math.h&gt;</td><td>수학 함수</td><td>sqrt, pow, sin</td></tr><tr><td>&lt;time.h&gt;</td><td>시간·날짜</td><td>time, clock, difftime</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 요약</h2>



<p><code>#include</code>는 <strong>외부에 작성된 코드나 함수 선언을 현재 파일로 가져오는 통로</strong>입니다. </p>



<p>시스템 라이브러리는 <code>&lt; &gt;</code>를, 내가 만든 파일은 <code>" "</code>를 사용합니다.</p>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/include-%ec%a7%80%ec%8b%9c%ec%9e%90/40565/">#include 지시자</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/include-%ec%a7%80%ec%8b%9c%ec%9e%90/40565/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Linux File Permissions Handbook (파일 권한 정리 핸드북)</title>
		<link>https://lycos7560.com/etc/linux-file-permissions-handbook-%ed%8c%8c%ec%9d%bc-%ea%b6%8c%ed%95%9c-%ec%a0%95%eb%a6%ac-%ed%95%b8%eb%93%9c%eb%b6%81/40555/</link>
					<comments>https://lycos7560.com/etc/linux-file-permissions-handbook-%ed%8c%8c%ec%9d%bc-%ea%b6%8c%ed%95%9c-%ec%a0%95%eb%a6%ac-%ed%95%b8%eb%93%9c%eb%b6%81/40555/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Mon, 16 Mar 2026 21:00:46 +0000</pubDate>
				<category><![CDATA[기타]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40555</guid>

					<description><![CDATA[<p>1. Linux 권한의 3요소 Linux의 권한은 간단하지만 강력한 원칙을 따른다. 모든 파일과 디렉터리에는 세 가지 사용자 그룹에 대해 세가지 유형의 접근 권한이 있다. 1.1 권한 유형 1.2 사용자 그룹 2. 권한 문자열 읽기 2.1 문자열 구조 분석 맨 앞의 문자는 파일의 유형을 나타내고, 이후 9개의 문자가 3개씩 나뉘어 소유자·그룹·기타의 권한을 나타낸다. 2.2 파일 유형 기호 [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/linux-file-permissions-handbook-%ed%8c%8c%ec%9d%bc-%ea%b6%8c%ed%95%9c-%ec%a0%95%eb%a6%ac-%ed%95%b8%eb%93%9c%eb%b6%81/40555/">Linux File Permissions Handbook (파일 권한 정리 핸드북)</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-a7e9a666      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#1-linux-권한의-3요소" class="uagb-toc-link__trigger">1. Linux 권한의 3요소</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#11-권한-유형" class="uagb-toc-link__trigger">1.1 권한 유형</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#12-사용자-그룹" class="uagb-toc-link__trigger">1.2 사용자 그룹</a></li></ul></li><li class="uagb-toc__list"><a href="#2-권한-문자열-읽기" class="uagb-toc-link__trigger">2. 권한 문자열 읽기</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#21-문자열-구조-분석" class="uagb-toc-link__trigger">2.1 문자열 구조 분석</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#22-파일-유형-기호" class="uagb-toc-link__trigger">2.2 파일 유형 기호</a></li></ul></li></ul></li><li class="uagb-toc__list"><a href="#3-자주-사용하는-권한-패턴-명령어" class="uagb-toc-link__trigger">3. 자주 사용하는 권한 패턴 명령어</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#31-파일-권한" class="uagb-toc-link__trigger">3.1 파일 권한</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#32-디렉터리-권한" class="uagb-toc-link__trigger">3.2 디렉터리 권한</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#디렉터리와실행권한" class="uagb-toc-link__trigger"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" />  디렉터리와 실행 권한</a></li></ul></li></ul></li></ul></li><li class="uagb-toc__list"><a href="#4-chmod로-권한-변경하기" class="uagb-toc-link__trigger">4. chmod로 권한 변경하기</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#41-기호-방식" class="uagb-toc-link__trigger">4.1 기호 방식</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#42-숫자-방식" class="uagb-toc-link__trigger">4.2 숫자 방식</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#43-재귀적-권한-변경-r-옵션" class="uagb-toc-link__trigger">4.3 재귀적 권한 변경 (-R 옵션)</a></li></ul></li></ul></li></ul></li></ul></li><li class="uagb-toc__list"><a href="#5-chown-으로-소유권-변경하기" class="uagb-toc-link__trigger">5. chown 으로 소유권 변경하기</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#51-소유자-변경" class="uagb-toc-link__trigger">5.1 소유자 변경</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#52-재귀적-소유권-변경" class="uagb-toc-link__trigger">5.2 재귀적 소유권 변경</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#53-chgrp명령그룹전용변경" class="uagb-toc-link__trigger">5.3 chgrp 명령 (그룹 전용 변경)</a></li></ul></li></ul></li></ul></li></ul></li></ul></li><li class="uagb-toc__list"><a href="#6-특수-권한-고급" class="uagb-toc-link__trigger">6. 특수 권한 (고급)</a><li class="uagb-toc__list"><a href="#7-umask-기본-권한-마스크" class="uagb-toc-link__trigger">7. umask &#8211; 기본 권한 마스크</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#71-umask-동작-원리" class="uagb-toc-link__trigger">7.1 umask 동작 원리</a></li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li><li class="uagb-toc__list"><a href="#8-실무-팁-자주-하는-실수" class="uagb-toc-link__trigger">8. 실무 팁 &amp; 자주 하는 실수</a></ul></ul></ul></ul></ul></ul></ol>					</div>
									</div>
				</div>
			


<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">1. Linux 권한의 3요소</h2>



<p>Linux의 권한은 간단하지만 강력한 원칙을 따른다.</p>



<p>모든 파일과 디렉터리에는 <strong>세 가지 사용자 그룹</strong>에 대해 <strong>세가지 유형의 접근 권한</strong>이 있다.</p>



<ul class="wp-block-list">
<li>Linux는 &#8220;<strong>최소 권한 원칙(Principle of Least Privilege)</strong>&#8220;을 따른다. <br>사용자와 프로세스에게 작업 수행에 필요한 최소한의 권한만 부여하는 것이 보안의 기본이다.</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">1.1 권한 유형</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">• 읽기 (r)  –  파일 내용 보기 또는 디렉터리 목록 조회
• 쓰기 (w)  –  파일 내용 수정 또는 디렉터리 내 파일 생성·삭제
• 실행 (x)  –  파일을 프로그램으로 실행하거나 디렉터리에 진입</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">1.2 사용자 그룹</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">• 소유자 (u, user)   –  파일을 소유한 사용자
• 그룹 (g, group)    –  해당 파일의 그룹에 속한 사용자들
• 기타 (o, others)   –  시스템의 모든 다른 사용자</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h2 class="wp-block-heading">2. 권한 문자열 읽기</h2>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">2.1 문자열 구조 분석</h3>



<p>맨 앞의 문자는 <strong>파일의 유형</strong>을 나타내고, 이후 9개의 문자가 3개씩 나뉘어 <strong>소유자·그룹·기타</strong>의 권한을 나타낸다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-a : 숨김 파일 포함 (.으로 시작하는 파일)
-l : 상세 정보(long format) 출력
-h : human readable (KB, MB, GB)

[lycos7560@DMT-RL01 ~]$ ls -alh
total 24K
drwx------. 3 lycos7560 lycos7560  132 Mar 16 05:38 .
drwxr-xr-x. 4 root      root        39 Mar 16 04:59 ..
-rw-------. 1 lycos7560 lycos7560 3.3K Mar 17 05:21 .bash_history
-rw-r--r--. 1 lycos7560 lycos7560   18 Oct 29  2024 .bash_logout
-rw-r--r--. 1 lycos7560 lycos7560  144 Oct 29  2024 .bash_profile
-rw-r--r--. 1 lycos7560 lycos7560  522 Oct 29  2024 .bashrc
drwx------. 3 lycos7560 lycos7560   20 Mar 12 07:19 .config
-rw-------. 1 lycos7560 lycos7560   38 Mar 11 04:36 .lesshst
-rw-r-x---. 1 root      root        12 Mar 16 05:38 myfile.txt


# 현재 사용자 및 그룹 확인
id
[lycos7560@DMT-RL01 ~]$ id
uid=1000(lycos7560) gid=1000(lycos7560) groups=1000(lycos7560),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

# 특정 사용자가 속한 그룹 확인
groups lycos7560
[lycos7560@DMT-RL01 ~]$ groups lycos7560
lycos7560 : lycos7560 wheel (wheel은 내가 넣음)
</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-  rwx  r-x  r--
│   │    │    │
│   │    │    └── 기타(Others): 읽기 전용
│   │    └─────── 그룹(Group): 읽기 및 실행
│   └──────────── 소유자(Owner): 읽기, 쓰기, 실행
└──────────────── 파일 유형 (- = 파일, d = 디렉터리)</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">2.2 파일 유형 기호</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>기호</strong></td><td><strong>의미</strong></td></tr><tr><td>&#8211;</td><td>일반&nbsp;파일</td></tr><tr><td>d</td><td>디렉터리(Directory)</td></tr><tr><td>l</td><td>심볼릭&nbsp;링크(Symbolic&nbsp;Link)</td></tr><tr><td>c</td><td>문자&nbsp;장치&nbsp;파일(Character&nbsp;Device)</td></tr><tr><td>b</td><td>블록&nbsp;장치&nbsp;파일(Block&nbsp;Device)</td></tr><tr><td>s</td><td>소켓(Socket)</td></tr><tr><td>p</td><td>파이프(Named&nbsp;Pipe)</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h2 class="wp-block-heading">3. 자주 사용하는 권한 패턴 명령어</h2>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">3.1 파일 권한</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>숫자</strong></td><td><strong>기호</strong></td><td><strong>설명</strong></td><td><strong>주요&nbsp;용도</strong></td></tr><tr><td>644</td><td>rw-r&#8211;r&#8211;</td><td>소유자: 읽기/쓰기, 나머지: 읽기 전용</td><td>일반&nbsp;텍스트,&nbsp;설정&nbsp;파일</td></tr><tr><td>755</td><td>rwxr-xr-x</td><td>소유자:&nbsp;모든&nbsp;권한,&nbsp;나머지:&nbsp;읽기+실행</td><td>스크립트,&nbsp;실행&nbsp;파일</td></tr><tr><td>600</td><td>rw&#8212;&#8212;-</td><td>소유자만&nbsp;읽기/쓰기&nbsp;가능</td><td>SSH&nbsp;키,&nbsp;비밀번호&nbsp;파일</td></tr><tr><td>400</td><td>r&#8212;&#8212;&#8211;</td><td>소유자만&nbsp;읽기&nbsp;가능&nbsp;(쓰기&nbsp;불가)</td><td>백업&nbsp;파일,&nbsp;중요&nbsp;설정</td></tr><tr><td>777</td><td>rwxrwxrwx</td><td>모든&nbsp;사용자가&nbsp;모든&nbsp;권한</td><td>매우 위험! (보안의 문제 사용을 지양)</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">3.2 디렉터리 권한</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>숫자</strong></td><td><strong>기호</strong></td><td><strong>설명</strong></td><td><strong>주의사항</strong></td></tr><tr><td>755</td><td>rwxr-xr-x</td><td>표준&nbsp;디렉터리&nbsp;권한</td><td>일반적으로&nbsp;가장&nbsp;많이&nbsp;사용</td></tr><tr><td>700</td><td>rwx&#8212;&#8212;</td><td>소유자만&nbsp;접근&nbsp;가능한&nbsp;비공개&nbsp;디렉터리</td><td>개인&nbsp;데이터&nbsp;폴더에&nbsp;적합</td></tr><tr><td>775</td><td>rwxrwxr-x</td><td>소유자와&nbsp;그룹&nbsp;모두&nbsp;쓰기&nbsp;가능</td><td>팀&nbsp;협업&nbsp;폴더에&nbsp;사용</td></tr><tr><td>644</td><td>rw-r&#8211;r&#8211;</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;사용&nbsp;불가</td><td>실행(x)&nbsp;권한&nbsp;없이&nbsp;디렉터리&nbsp;진입&nbsp;불가</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;&nbsp;디렉터리와&nbsp;실행&nbsp;권한</strong></h3>



<p>디렉터리에서 실행(x) 권한은 &#8220;진입 권한&#8221;을 의미한다.</p>



<p> 읽기(r)만 있고 실행(x)이 없으면 디렉터리 안에 파일이 있다는 사실은 알아도 접근할 수 없다.</p>



<p>반드시 실행 권한을 포함해야 합니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h2 class="wp-block-heading">4. chmod로 권한 변경하기</h2>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">4.1 기호 방식</h3>



<p>기호 방식은 매우 직관적이며 현재 권한을 유지한 채 특정 권한만 추가하거나 제거할 때 유용하다. </p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>기호</strong></td><td><strong>의미</strong></td></tr><tr><td>u</td><td>소유자(user)</td></tr><tr><td>g</td><td>그룹(group)</td></tr><tr><td>o</td><td>기타(others)</td></tr><tr><td>a</td><td>모두(all)&nbsp;=&nbsp;u+g+o</td></tr><tr><td>+</td><td>권한&nbsp;추가</td></tr><tr><td>&#8211;</td><td>권한&nbsp;제거</td></tr><tr><td>=</td><td>권한&nbsp;설정(기존&nbsp;권한&nbsp;덮어쓰기)</td></tr></tbody></table></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 소유자에게 실행 권한 부여
chmod u+x myfile

# 그룹의 쓰기 권한 제거
chmod g-w myfile

# 기타 사용자에게 읽기 권한 부여
chmod o+r myfile

# 모든 사용자에게 실행 권한 부여
chmod a+x myfile

# 그룹 권한을 읽기+실행으로 정확히 설정 (= 사용)
chmod g=rx myfile

# 여러 권한을 동시에 변경 (콤마로 구분)
chmod u+x,g-w,o+r myfile</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">4.2 숫자 방식</h3>



<p>숫자 방식은 빠르고 정확하다.</p>



<p>각 자리는 소유자·그룹·기타의 권한을 나타내며 r=4, w=2, x=1을 더해 계산한다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>권한</strong></td><td><strong>이진수</strong></td><td><strong>10진수</strong></td></tr><tr><td>&#8212;</td><td>000</td><td>0</td></tr><tr><td>&#8211;x</td><td>001</td><td>1</td></tr><tr><td>-w-</td><td>010</td><td>2</td></tr><tr><td>-wx</td><td>011</td><td>3</td></tr><tr><td>r&#8211;</td><td>100</td><td>4</td></tr><tr><td>r-x</td><td>101</td><td>5</td></tr><tr><td>rw-</td><td>110</td><td>6</td></tr><tr><td>rwx</td><td>111</td><td>7</td></tr></tbody></table></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">예: 755 = 소유자(7=rwx) + 그룹(5=r-x) + 기타(5=r-x)

chmod 755 myfile       # rwxr-xr-x
chmod 644 myfile       # rw-r--r--
chmod 600 myfile       # rw-------
chmod 400 myfile       # r--------
chmod 700 mydir        # rwx------</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">4.3 재귀적 권한 변경 (-R 옵션)</h3>



<p>디렉터리와 그 안의 모든 파일/하위 디렉터리에 권한을 일괄 적용할 때 사용한다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 웹 서버 디렉터리 전체 권한 설정
sudo chmod -R 755 /var/www/html/

# 특정 패턴의 파일만 선택적으로 변경
find /var/www/html -type f -exec chmod 644 {} \;
find /var/www/html -type d -exec chmod 755 {} \;

# 파일과 디렉터리 권한 분리 팁
chmod -R 755를 사용하면 파일도 755(실행 가능)가 되어 보안상 좋지 않다.
find 명령으로 파일(644)과 디렉터리(755)를 따로 설정하는 것을 권장.</pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h2 class="wp-block-heading">5. chown 으로 소유권 변경하기</h2>



<p>chown 명령으로 파일의 디렉터리의 소유자와 그룹을 변경할 수 있다.</p>



<p>일반적으로 관리자 권한(sudo)이 필요하다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">5.1 소유자 변경</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 소유자를 alice로 변경
sudo chown alice myfile

# 소유자를 alice, 그룹을 staff로 동시 변경
sudo chown alice:staff myfile

# 그룹만 developers로 변경 (콜론 앞 생략)
sudo chown :developers myfile</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">5.2 재귀적 소유권 변경</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 디렉터리 전체 소유자와 그룹 변경
sudo chown -R alice:staff /home/alice/projects/

# 소유자만 재귀적으로 변경
sudo chown -R www-data /var/www/html/</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">5.3 <strong>chgrp 명령 (그룹 전용 변경)</strong></h3>



<p>그룹만 변경하고 싶을 때는 chgrp 명령을 사용할 수도 있다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">sudo chgrp developers myfile
sudo chgrp -R developers /srv/project/</pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h2 class="wp-block-heading">6. 특수 권한 (고급)</h2>



<p>일반 rwx 외에 시스템 관리에 중요한 역할을 하는 <strong>SetUID, SetGID, Sticky Bit</strong> 세 가지 특수 권한이 있다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>권한&nbsp;유형</strong></td><td><strong>명령어&nbsp;예시</strong></td><td><strong>설명</strong></td></tr><tr><td>SetUID&nbsp;(4xxx)</td><td>chmod&nbsp;4755&nbsp;file</td><td>실행&nbsp;시&nbsp;소유자&nbsp;권한으로&nbsp;동작&nbsp;(예:&nbsp;/usr/bin/passwd)</td></tr><tr><td>SetGID&nbsp;(2xxx)</td><td>chmod&nbsp;2755&nbsp;dir</td><td>파일을&nbsp;소유자&nbsp;그룹으로&nbsp;생성,&nbsp;공유&nbsp;폴더에&nbsp;유용</td></tr><tr><td>Sticky&nbsp;Bit&nbsp;(1xxx)</td><td>chmod&nbsp;1777&nbsp;/tmp</td><td>파일&nbsp;소유자만&nbsp;삭제&nbsp;가능&nbsp;(/tmp&nbsp;디렉터리에&nbsp;사용)</td></tr></tbody></table></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># SetUID 설정 (소유자 권한으로 실행)
chmod 4755 myprogram    # 또는: chmod u+s myprogram

# SetGID 설정 (그룹 권한 상속)
chmod 2755 shared_dir   # 또는: chmod g+s shared_dir

# Sticky Bit 설정 (소유자만 삭제 가능)
chmod 1777 /tmp         # 또는: chmod +t /tmp

# ls -l에서 특수 권한 확인
# -rwsr-xr-x  → SetUID (소유자 x 자리에 s)
# -rwxr-sr-x  → SetGID (그룹 x 자리에 s)
# drwxrwxrwt  → Sticky Bit (기타 x 자리에 t)

- SetUID 보안 주의
SetUID가 설정된 프로그램은 실행 시 소유자(보통 root로 설정) 권한으로 동작한다.
불필요한 파일에 SetUID를 설정하면 심각한 보안 취약점이 될 수 있다.
반드시 필요한 경우에만 사용.</pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h2 class="wp-block-heading">7. umask &#8211; 기본 권한 마스크</h2>



<p>새 파일이나 디렉터리를 생성할 때 자동으로 적용되는 기본 권한을 제어한다.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">7.1 <strong>umask 동작</strong> 원리</h3>



<ul class="wp-block-list">
<li>파일 최대 권한: 666 (rw-rw-rw-) 실행 권한은 기본적으로 부여되지 않음</li>



<li>디렉터리 최대 권한: 777(rwxrwxrwx)</li>



<li>실제 권한 = 최대 권한 &#8211; umask 값</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 현재 umask 확인
umask
[lycos7560@DMT-RL01 ~]$ umask
0022

# umask 022 적용 시 (가장 일반적)
# 파일:     666 - 022 = 644 (rw-r--r--)
# 디렉터리: 777 - 022 = 755 (rwxr-xr-x)

# umask 변경 (현재 세션에만 적용)
umask 027

# 영구 적용: ~/.bashrc 또는 /etc/profile에 추가
echo "umask 027" >> ~/.bashrc</pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h2 class="wp-block-heading">8. 실무 팁 &amp; 자주 하는 실수</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>상황</strong></td><td><strong>원인</strong></td><td><strong>해결&nbsp;방법</strong></td></tr><tr><td>스크립트&nbsp;실행&nbsp;안&nbsp;됨</td><td>실행(x)&nbsp;권한&nbsp;없음</td><td>chmod&nbsp;+x&nbsp;script.sh</td></tr><tr><td>디렉터리&nbsp;진입&nbsp;불가</td><td>실행(x)&nbsp;권한&nbsp;없음</td><td>chmod&nbsp;755&nbsp;dirname</td></tr><tr><td>파일&nbsp;수정&nbsp;안&nbsp;됨</td><td>쓰기(w)&nbsp;권한&nbsp;없음</td><td>chmod&nbsp;u+w&nbsp;filename</td></tr><tr><td>sudo&nbsp;없이&nbsp;chown&nbsp;불가</td><td>일반&nbsp;사용자&nbsp;제한</td><td>sudo&nbsp;chown&nbsp;사용</td></tr><tr><td>777&nbsp;설정&nbsp;후&nbsp;보안&nbsp;문제</td><td>과도한&nbsp;권한&nbsp;부여</td><td>chmod&nbsp;755&nbsp;또는&nbsp;644로&nbsp;변경</td></tr></tbody></table></figure>



<p><strong>보안 체크리스트</strong></p>



<p>① 민감한 파일(SSH 키, 설정 파일)은 600 또는 400 사용  </p>



<p>② 웹 서버 파일은 644, 디렉터리는 755  </p>



<p>③ 777은 절대 사용하지 않기  </p>



<p>④ SetUID 파일 주기적 점검: find / -perm -4000 -ls 2>/dev/null</p>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/linux-file-permissions-handbook-%ed%8c%8c%ec%9d%bc-%ea%b6%8c%ed%95%9c-%ec%a0%95%eb%a6%ac-%ed%95%b8%eb%93%9c%eb%b6%81/40555/">Linux File Permissions Handbook (파일 권한 정리 핸드북)</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/linux-file-permissions-handbook-%ed%8c%8c%ec%9d%bc-%ea%b6%8c%ed%95%9c-%ec%a0%95%eb%a6%ac-%ed%95%b8%eb%93%9c%eb%b6%81/40555/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rocky Linux 10 DNF 저장소 추가</title>
		<link>https://lycos7560.com/etc/rocky-linux-10-dnf-%ec%a0%80%ec%9e%a5%ec%86%8c-%ec%b6%94%ea%b0%80/40549/</link>
					<comments>https://lycos7560.com/etc/rocky-linux-10-dnf-%ec%a0%80%ec%9e%a5%ec%86%8c-%ec%b6%94%ea%b0%80/40549/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Thu, 12 Mar 2026 21:05:29 +0000</pubDate>
				<category><![CDATA[기타]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40549</guid>

					<description><![CDATA[<p>DNF 저장소 추가? Rocky Linux는 기업용 리눅스 배포판으로 기본적으로 안정성을 위해 패키지 수가 제한적입니다. 그래서 기본 저장소만 사용하면 htop, iftop, ffmpeg 같은 패키지를 찾을 수 없는 경우가 많습니다. 이 때문에 추가 저장소(repository)를 활성화하여 패키지를 확장합니다. 순서 1. CRB 저장소 (CodeReady Builder) CRB는 EPEL 패키지 일부가 의존하는 패키지를 포함하고 있어, EPEL 사용 전에 반드시 활성화해야 합니다. [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/rocky-linux-10-dnf-%ec%a0%80%ec%9e%a5%ec%86%8c-%ec%b6%94%ea%b0%80/40549/">Rocky Linux 10 DNF 저장소 추가</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-b77fcaa8      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#dnf-저장소-추가" class="uagb-toc-link__trigger">DNF 저장소 추가?</a><li class="uagb-toc__list"><a href="#순서" class="uagb-toc-link__trigger">순서</a><li class="uagb-toc__list"><a href="#1-crb-저장소-codeready-builder" class="uagb-toc-link__trigger">1. CRB 저장소 (CodeReady Builder)</a><li class="uagb-toc__list"><a href="#2-epel-저장소-extra-packages-for-enterprise-linux" class="uagb-toc-link__trigger">2. EPEL 저장소 (Extra Packages for Enterprise Linux)</a><li class="uagb-toc__list"><a href="#3-rpm-fusion-저장소" class="uagb-toc-link__trigger">3. RPM Fusion 저장소</a><li class="uagb-toc__list"><a href="#참고" class="uagb-toc-link__trigger">참고</a></ol>					</div>
									</div>
				</div>
			


<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">DNF 저장소 추가?</h3>



<p>Rocky Linux는 기업용 리눅스 배포판으로 기본적으로 안정성을 위해 패키지 수가 제한적입니다. </p>



<p>그래서 기본 저장소만 사용하면 <code>htop</code>, <code>iftop</code>, <code>ffmpeg</code> 같은 패키지를 찾을 수 없는 경우가 많습니다.</p>



<p>이 때문에 추가 저장소(repository)를 활성화하여 패키지를 확장합니다.</p>



<p></p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">순서</h3>



<ol class="wp-block-list">
<li>CRB </li>



<li>EPEL</li>



<li>RPM Fusion 설치 (필요한 경우)</li>
</ol>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">1. CRB 저장소 (CodeReady Builder)</h3>



<ol class="wp-block-list">
<li></li>
</ol>



<p>CRB는 EPEL 패키지 일부가 의존하는 패키지를 포함하고 있어, EPEL 사용 전에 반드시 활성화해야 합니다.</p>



<p>개발용 라이브러리 및 빌드 의존성 패키지를 제공합니다.</p>



<ul class="wp-block-list">
<li><code>devel</code> 패키지</li>



<li>컴파일 관련 라이브러리</li>



<li>빌드 도구</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Rocky Linux 10은 /usr/bin/crb 유틸리티를 제공합니다.

# Rocky Linux 10에서 CRB 활성화
sudo dnf config-manager --set-enabled crb

dnf repolist | grep crb


# dnf-plugins-core가 없으면 먼저 설치
sudo dnf install dnf-plugins-core

# CRB 활성화 (Rocky Linux 9, 10 공통)
sudo crb enable

# CRB 확인
sudo crb status</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">2. EPEL 저장소 (Extra Packages for Enterprise Linux)</h3>



<ol start="2" class="wp-block-list">
<li></li>
</ol>



<p>Extra Packages for Enterprise Linux의 약자로 RHEL 계열에서 부족한 패키지를 제공하는 저장소입니다. </p>



<p>대부분의 서버에서 CRB 다음으로 바로 설치하는 저장소</p>



<p>제공 패키지 예시</p>



<ul class="wp-block-list">
<li>htop</li>



<li>neovim</li>



<li>iftop</li>



<li>nmap</li>



<li>fail2ban</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 설치 방법
sudo dnf install epel-release

# 저장소 확인
dnf repolist
```

**예시 출력**
[lycos7560@DMT-RL01 ~]$ dnf repolist
repo id                                           repo name
appstream                                         Rocky Linux 10 - AppStream
baseos                                            Rocky Linux 10 - BaseOS
crb                                               Rocky Linux 10 - CRB
epel                                              Extra Packages for Enterprise Linux 10 - x86_64
extras                                            Rocky Linux 10 - Extras
rpmfusion-free-updates                            RPM Fusion for EL 10 - Free - Updates
</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">3. RPM Fusion 저장소 </h3>



<p>RPM Fusion은 멀티미디어 및 추가 패키지를 제공하는 저장소입니다. </p>



<p>free(오픈소스)와 nonfree(비오픈소스) 두 가지로 나뉩니다.</p>



<p>RPM Fusion은 EPEL에 의존하므로 반드시 EPEL을 먼저 설치해야 합니다.</p>



<p>제공 패키지 예시</p>



<ul class="wp-block-list">
<li>ffmpeg</li>



<li>vlc</li>
</ul>



<p><code>$(rpm -E %rhel)</code> 변수를 사용하면 Rocky Linux 버전을 자동으로 감지하여 올바른 패키지를 내려받습니다</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># free 저장소
sudo dnf install --nogpgcheck \
  https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm

# nonfree 저장소 (필요한 경우 추가)
sudo dnf install --nogpgcheck \
  https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-$(rpm -E %rhel).noarch.rpm
```

---

## 실무에서 많이 사용하는 저장소 조합

대부분의 Rocky Linux 10 서버는 다음 저장소를 활성화합니다.
```
baseos
appstream
crb
epel</pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)"/>



<h3 class="wp-block-heading">참고</h3>



<p>패키지 검색</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">dnf search 패키지명

dnf search htop</pre>



<div style="height:19px" aria-hidden="true" class="wp-block-spacer"></div>



<p>특정 파일을 제공하는 패키지 찾기</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">dnf provides 파일명

dnf provides htop</pre>



<div style="height:19px" aria-hidden="true" class="wp-block-spacer"></div>



<p>저장소 임시 제외</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 특정 저장소를 제외하고 설치하고 싶을 때 사용합니다.

dnf install 패키지명 --disablerepo=epel</pre>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="6XFKrBcgcQ"><a href="https://lycos7560.com/etc/dnf-package-manager-dnf-%ed%8c%a8%ed%82%a4%ec%a7%80-%ea%b4%80%eb%a6%ac%ec%9e%90/40530/">DNF Package Manager (DNF 패키지 관리자)</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;DNF Package Manager (DNF 패키지 관리자)&#8221; &#8212; 어제와 내일의 나 그 사이의 이야기" src="https://lycos7560.com/etc/dnf-package-manager-dnf-%ed%8c%a8%ed%82%a4%ec%a7%80-%ea%b4%80%eb%a6%ac%ec%9e%90/40530/embed/#?secret=4pAmu41OkY#?secret=6XFKrBcgcQ" data-secret="6XFKrBcgcQ" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>
<p>The post <a href="https://lycos7560.com/etc/rocky-linux-10-dnf-%ec%a0%80%ec%9e%a5%ec%86%8c-%ec%b6%94%ea%b0%80/40549/">Rocky Linux 10 DNF 저장소 추가</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/rocky-linux-10-dnf-%ec%a0%80%ec%9e%a5%ec%86%8c-%ec%b6%94%ea%b0%80/40549/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>top 명령어 핵심 정리 &#8211; Linux top</title>
		<link>https://lycos7560.com/etc/top-%eb%aa%85%eb%a0%b9%ec%96%b4-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac-linux-top/40541/</link>
					<comments>https://lycos7560.com/etc/top-%eb%aa%85%eb%a0%b9%ec%96%b4-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac-linux-top/40541/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Thu, 12 Mar 2026 20:15:11 +0000</pubDate>
				<category><![CDATA[기타]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=40541</guid>

					<description><![CDATA[<p>🔥 가장 많이 쓰는 top 단축키 키 기능 설명 q 종료 top 종료 h 도움말 모든 단축키 보기 k 프로세스 종료 PID 입력 후 kill r nice 값 변경 프로세스 우선순위 변경 c 명령어 전체 표시 프로그램 경로 표시 P CPU 사용률 정렬 CPU 많이 쓰는 순 M 메모리 사용률 정렬 메모리 많이 쓰는 순 [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/etc/top-%eb%aa%85%eb%a0%b9%ec%96%b4-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac-linux-top/40541/">top 명령어 핵심 정리 &#8211; Linux top</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-ab3ce747      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							목차						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#가장-많이-쓰는-top-단축키" class="uagb-toc-link__trigger"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 가장 많이 쓰는 top 단축키</a><li class="uagb-toc__list"><a href="#예시-기본" class="uagb-toc-link__trigger">예시 (기본)</a><li class="uagb-toc__list"><a href="#1-시스템-전체-상태" class="uagb-toc-link__trigger">1&#x20e3; 시스템 전체 상태</a><li class="uagb-toc__list"><a href="#2-프로세스-상태" class="uagb-toc-link__trigger">2&#x20e3; 프로세스 상태</a><li class="uagb-toc__list"><a href="#3-cpu-사용률" class="uagb-toc-link__trigger">3&#x20e3; CPU 사용률</a><li class="uagb-toc__list"><a href="#4-메모리-정보" class="uagb-toc-link__trigger">4&#x20e3; 메모리 정보</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#swap-정보" class="uagb-toc-link__trigger">Swap 정보</a></li></ul></li><li class="uagb-toc__list"><a href="#5-프로세스-정보-영역-process-list" class="uagb-toc-link__trigger">5&#x20e3; 프로세스 정보 영역 (Process List)</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#pid-process-id" class="uagb-toc-link__trigger">PID (Process ID)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#pr-priority" class="uagb-toc-link__trigger">PR (Priority)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#ni-nice-value" class="uagb-toc-link__trigger">NI (Nice Value)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#virt-virtual-memory" class="uagb-toc-link__trigger">VIRT (Virtual Memory)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#res-resident-memory" class="uagb-toc-link__trigger">RES (Resident Memory)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#shr-shared-memory" class="uagb-toc-link__trigger">SHR (Shared Memory)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#s-process-state" class="uagb-toc-link__trigger">S (Process State)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#cpu" class="uagb-toc-link__trigger">%CPU</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#mem" class="uagb-toc-link__trigger">%MEM</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#time" class="uagb-toc-link__trigger">TIME+</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#command" class="uagb-toc-link__trigger">COMMAND</a></li></ul></li></ul></li><li class="uagb-toc__list"><a href="#top에서-자주-보이는-커널시스템-프로세스-10개" class="uagb-toc-link__trigger"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> top에서 자주 보이는 커널/시스템 프로세스 10개</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#systemd" class="uagb-toc-link__trigger">systemd</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#kworker" class="uagb-toc-link__trigger">kworker</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#ksoftirqd" class="uagb-toc-link__trigger">ksoftirqd</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#rcu" class="uagb-toc-link__trigger">rcu</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#migration" class="uagb-toc-link__trigger">migration</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#kthreadd" class="uagb-toc-link__trigger">kthreadd</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#kswapd" class="uagb-toc-link__trigger">kswapd</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#kcompactd" class="uagb-toc-link__trigger">kcompactd</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#cpuhp" class="uagb-toc-link__trigger">cpuhp</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#idle-inject" class="uagb-toc-link__trigger">idle_inject</a></ul></ul></ul></ol>					</div>
									</div>
				</div>
			


<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 가장 많이 쓰는 top 단축키</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>키</th><th>기능</th><th>설명</th></tr></thead><tbody><tr><td><code>q</code></td><td>종료</td><td>top 종료</td></tr><tr><td><code>h</code></td><td>도움말</td><td>모든 단축키 보기</td></tr><tr><td><code>k</code></td><td>프로세스 종료</td><td>PID 입력 후 kill</td></tr><tr><td><code>r</code></td><td>nice 값 변경</td><td>프로세스 우선순위 변경</td></tr><tr><td><code>c</code></td><td>명령어 전체 표시</td><td>프로그램 경로 표시</td></tr><tr><td><code>P</code></td><td>CPU 사용률 정렬</td><td>CPU 많이 쓰는 순</td></tr><tr><td><code>M</code></td><td>메모리 사용률 정렬</td><td>메모리 많이 쓰는 순</td></tr><tr><td><code>T</code></td><td>실행 시간 정렬</td><td>오래 실행된 순</td></tr><tr><td><code>N</code></td><td>PID 정렬</td><td>PID 기준 정렬</td></tr><tr><td>R</td><td>정렬 역순</td><td>정렬 방향 반전</td></tr><tr><td>1</td><td>CPU 코어별 보기</td><td>CPU 코어별 사용률 표시</td></tr><tr><td>t</td><td>CPU 정보 토글</td><td>CPU 사용률 영역 표시/숨김</td></tr><tr><td>m</td><td>메모리 정보 토글</td><td>메모리 정보 표시/숨김</td></tr><tr><td>l</td><td>Load average 토글</td><td>load average 표시/숨김</td></tr><tr><td>i</td><td>Idle 프로세스 숨김</td><td>CPU 사용 중인 프로세스만 표시</td></tr><tr><td>u</td><td>사용자 필터</td><td>특정 사용자 프로세스만 표시</td></tr><tr><td>d</td><td>refresh 시간 변경</td><td>화면 갱신 주기 변경</td></tr><tr><td>s</td><td>refresh 시간 변경 (구버전)</td><td>갱신 간격 설정</td></tr><tr><td>f</td><td>표시 컬럼 설정</td><td>top 컬럼 추가/삭제</td></tr><tr><td>W</td><td>설정 저장</td><td>현재 top 설정 저장</td></tr><tr><td>V</td><td>트리 구조로 부모-자식 관계 표시</td><td></td></tr><tr><td>v</td><td>선택한 프로세스의 자식 프로세스 숨기기/보이기</td><td></td></tr><tr><td>F</td><td>포커스 모드 진입</td><td></td></tr></tbody></table></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">단축키 도움말
# 원문
Help for Interactive Commands - procps-ng 4.0.4
Window 1:Def: Cumulative mode Off.  System: Delay 3.0 secs; Secure mode Off.

  Z,B,E,e   Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale
  l,t,m,I,0 Toggle: 'l' load avg; 't' task/cpu; 'm' memory; 'I' Irix; '0' zeros
  1,2,3,4,5 Toggle: '1/2/3' cpu/numa views; '4' cpus abreast; '5' P/E-cores
  f,X       Fields: 'f' add/remove/order/sort; 'X' increase fixed-width fields

  L,&amp;,&lt;,> . Locate: 'L'/'&amp;' find/again; Move sort column: '&lt;'/'>' left/right
  R,H,J,C . Toggle: 'R' Sort; 'H' Threads; 'J' Num justify; 'C' Coordinates
  c,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justify
  x,y     . Toggle highlights: 'x' sort field; 'y' running tasks
  z,b     . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
  u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criteria
  n,#,^O  . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s)
  V,v,F   . Toggle: 'V' forest view; 'v' hide/show children; 'F' keep focused

  d,k,r,^R 'd' set delay; 'k' kill; 'r' renice; Ctrl+'R' renice autogroup
  ^G,K,N,U  View: ctl groups ^G; cmdline ^K; environment ^N; supp groups ^U
  Y,!,^E,P  Inspect 'Y'; Combine Cpus '!'; Scale time ^E; View namespaces ^P
  W,q       Write config file 'W'; Quit 'q'
          ( commands shown with '.' require a visible task display window )
Press 'h' or '?' for help with Windows,

# 번역본
대화형 명령어 도움말 - procps-ng 4.0.4
창 1: 기본값(Def): 누적 모드 꺼짐.  시스템: 갱신 지연 3.0초; 보안 모드 꺼짐.

  Z,B,E,e   전역 설정: 'Z' 색상; 'B' 굵게 표시; 'E'/'e' 요약/작업 메모리 표시 단위
  l,t,m,I,0 토글: 'l' load average; 't' 작업/CPU; 'm' 메모리; 'I' Irix 모드; '0' 0 값 표시
  1,2,3,4,5 토글: '1/2/3' CPU/NUMA 보기; '4' CPU 가로 나열; '5' P/E 코어 표시
  f,X       필드: 'f' 필드 추가/제거/순서/정렬; 'X' 고정 너비 필드 크기 증가

  L,&amp;,&lt;,> . 검색: 'L'/'&amp;' 찾기/다시 찾기; 정렬 열 이동: '&lt;'/'>' 왼쪽/오른쪽
  R,H,J,C . 토글: 'R' 정렬 방향; 'H' 스레드 표시; 'J' 숫자 정렬; 'C' 좌표 표시
  c,i,S,j . 토글: 'c' 명령어 이름/전체 명령줄; 'i' 유휴 작업; 'S' 시간; 'j' 문자열 정렬
  x,y     . 강조 토글: 'x' 정렬 필드 강조; 'y' 실행 중 작업 강조
  z,b     . 토글: 'z' 컬러/흑백; 'b' 굵게/역상 (x 또는 y가 활성화된 경우)
  u,U,o,O . 필터: 'u'/'U' 실행 사용자/모든 사용자; 'o'/'O' 다른 조건
  n,#,^O  . 설정: 'n'/'#' 표시할 최대 작업 수; 표시: Ctrl+'O' 다른 필터 보기
  V,v,F   . 토글: 'V' 트리(forest) 보기; 'v' 자식 프로세스 숨김/표시; 'F' 포커스 유지

  d,k,r,^R 'd' 갱신 지연 설정; 'k' 프로세스 종료; 'r' nice 값 변경; Ctrl+'R' autogroup nice 변경
  ^G,K,N,U  보기: Ctrl+'G' 제어 그룹; Ctrl+'K' 명령줄; Ctrl+'N' 환경 변수; Ctrl+'U' 보조 그룹
  Y,!,^E,P  검사: 'Y' 상세 검사; '!' CPU 결합; Ctrl+'E' 시간 단위 변경; Ctrl+'P' 네임스페이스 보기
  W,q       'W' 설정 파일 저장; 'q' 종료
          ( '.' 표시가 있는 명령어는 작업 목록 창이 보일 때만 사용 가능 )
Windows 관련 도움말은 'h' 또는 '?' 키를 누르십시오.</pre>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">예시 (기본)</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[lycos7560@DMT-RL01 ~]$ top
top - 03:42:50 up 2 min,  2 users,  load average: 0.01, 0.00, 0.00
Tasks: 269 total,   1 running, 268 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.1 hi,  0.0 si,  0.0 st
MiB Mem :   3621.8 total,   3136.7 free,    512.6 used,    187.3 buff/cache
MiB Swap:   4008.0 total,   4008.0 free,      0.0 used.   3109.2 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     28 root      20   0       0      0      0 I   0.3   0.0   0:00.17 kworker/1:0-events
      1 root      20   0   49176  40952  10468 S   0.0   1.1   0:02.13 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.02 kthreadd
      3 root      20   0       0      0      0 S   0.0   0.0   0:00.00 pool_workqueue_release
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-rcu_gp
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-sync_wq
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-slub_flushwq
      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-netns
      8 root      20   0       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0-events
      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri
     10 root      20   0       0      0      0 I   0.0   0.0   0:00.10 kworker/0:1-events
     11 root      20   0       0      0      0 I   0.0   0.0   0:00.00 kworker/u512:0-async
     12 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-mm_percpu_wq
     13 root      20   0       0      0      0 I   0.0   0.0   0:00.69 kworker/u512:1-async
     14 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_kthread
     15 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_rude_kthread
     16 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_trace_kthread
     17 root      20   0       0      0      0 S   0.0   0.0   0:00.00 ksoftirqd/0
     18 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_preempt
     19 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_exp_par_gp_kthread_worker/1
     20 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_exp_gp_kthread_worker
     21 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration/0
     22 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/0
     23 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
     24 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1
     25 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/1
     26 root      rt   0       0      0      0 S   0.0   0.0   0:00.52 migration/1
     27 root      20   0       0      0      0 S   0.0   0.0   0:00.00 ksoftirqd/1
     29 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-events_highpri
     30 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/2
     31 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/2
     32 root      rt   0       0      0      0 S   0.0   0.0   0:00.52 migration/2
     33 root      20   0       0      0      0 S   0.0   0.0   0:00.00 ksoftirqd/2
     34 root      20   0       0      0      0 I   0.0   0.0   0:00.00 kworker/2:0-rcu_gp
     35 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/2:0H-events_highpri
     36 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/3
     37 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/3
     38 root      rt   0       0      0      0 S   0.0   0.0   0:00.53 migration/3
     39 root      20   0       0      0      0 S   0.0   0.0   0:00.00 ksoftirqd/3
     40 root      20   0       0      0      0 I   0.0   0.0   0:00.09 kworker/3:0-events
     41 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/3:0H-events_highpri
     43 root      20   0       0      0      0 I   0.0   0.0   0:00.02 kworker/u512:2-async
</pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50)"/>



<h3 class="wp-block-heading">1&#x20e3; 시스템 전체 상태</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">top - 03:42:50 up 2 min,  2 users,  load average: 0.05, 0.05, 0.02</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>의미</th></tr></thead><tbody><tr><td><code>03:42:50</code></td><td>현재 시스템 시간</td></tr><tr><td><code>up 2 min</code></td><td>시스템이 부팅된 후 <strong>가동 시간</strong></td></tr><tr><td><code>2 users</code></td><td>현재 로그인한 사용자 수</td></tr><tr><td><code>load average</code></td><td>시스템 평균 부하</td></tr></tbody></table></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h5 class="wp-block-heading">load average</h5>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">0.05, 0.05, 0.02</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>각 의미</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>값</th><th>의미</th></tr></thead><tbody><tr><td>첫번째</td><td>1분 평균 부하</td></tr><tr><td>두번째</td><td>5분 평균 부하</td></tr><tr><td>세번째</td><td>15분 평균 부하</td></tr></tbody></table></figure>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Load Average 의미</strong></p>



<p>CPU가 처리해야 할 <strong>대기 작업 수</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">CPU 실행중 프로세스
CPU 실행 대기 프로세스
Disk I/O 대기 프로세스</pre>



<p>예시</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>CPU 코어</th><th>정상 load</th></tr></thead><tbody><tr><td>1 core</td><td>1.0</td></tr><tr><td>4 core</td><td>4.0</td></tr></tbody></table></figure>



<p>지금 값</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">0.05
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 거의 아무 작업도 없는 상태 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f44d.png" alt="👍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h3 class="wp-block-heading">2&#x20e3; 프로세스 상태</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Tasks: 269 total,   1 running, 268 sleeping,   0 stopped,   0 zombie</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>의미</th></tr></thead><tbody><tr><td>total</td><td>전체 프로세스 수</td></tr><tr><td>running</td><td>실행 중</td></tr><tr><td>sleeping</td><td>대기 상태</td></tr><tr><td>stopped</td><td>중지된 프로세스</td></tr><tr><td>zombie</td><td>좀비 프로세스</td></tr></tbody></table></figure>



<p>현재 상태</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>상태</th><th>값</th></tr></thead><tbody><tr><td>전체 프로세스</td><td>269</td></tr><tr><td>실행 중</td><td>1</td></tr><tr><td>대기</td><td>268</td></tr><tr><td>좀비</td><td>0</td></tr></tbody></table></figure>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 대부분 시스템 프로세스는 <strong>sleep 상태</strong>입니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h3 class="wp-block-heading">3&#x20e3; CPU 사용률</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.1 hi,  0.0 si,  0.0 st</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>CPU 사용률 항목</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>의미</th></tr></thead><tbody><tr><td>us (user)</td><td>사용자 프로그램 사용 CPU</td></tr><tr><td>sy (system)</td><td>커널 사용 CPU</td></tr><tr><td>ni (nice)</td><td>nice 값 조정된 프로세스<br><strong>nice 값이 변경된 프로세스가 사용한 CPU</strong>로<br>이 작업이 CPU를 20% 사용하면 %Cpu(s): 5 us, 3 sy, 20 ni, …</td></tr><tr><td>id (idle)</td><td>CPU 유휴 상태</td></tr><tr><td>wa (wait)</td><td>I/O 대기</td></tr><tr><td>hi</td><td>하드웨어 인터럽트</td></tr><tr><td>si</td><td>소프트웨어 인터럽트</td></tr><tr><td>st</td><td>VM에서 CPU 뺏긴 시간</td></tr></tbody></table></figure>



<p>현재 상태</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">100% idle
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> CPU 완전 여유 상태</pre>



<div style="height:5px" aria-hidden="true" class="wp-block-spacer"></div>



<p>멀티코어 환경에서 100%를 초과할 수 있음<br>(예: 4코어면 최대 400%)</p>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h3 class="wp-block-heading">4&#x20e3; 메모리 정보</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">MiB Mem :   3621.8 total,   3136.7 free,    512.6 used,    187.3 buff/cache
MiB Swap:   4008.0 total,   4008.0 free,      0.0 used.   3109.2 avail Mem</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>의미</th></tr></thead><tbody><tr><td>total</td><td>전체 메모리</td></tr><tr><td>free</td><td>완전히 남은 메모리</td></tr><tr><td>used</td><td>실제 사용</td></tr><tr><td>buff/cache</td><td>캐시 / 버퍼</td></tr></tbody></table></figure>



<p>현재 상태</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>값</th></tr></thead><tbody><tr><td>total</td><td>3621MB</td></tr><tr><td>free</td><td>3136MB</td></tr><tr><td>used</td><td>512MB</td></tr><tr><td>cache</td><td>187MB</td></tr></tbody></table></figure>



<p>참고: 리눅스는 <strong>남는 메모리를 캐시로 사용</strong>하므로 free 메모리가 적어도 실제로는 여유가 많을 수 있다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">예를 들어
free       3137 MB
buff/cache 187 MB
≈ 3324 MB

# 추가적으로 리눅스에서는 일부 메모리 커널이 예약(reserved)함. 
4096 MB - 약 400~500 MB
≈ 3600 MB

[lycos7560@DMT-RL01 ~]$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.5Gi       506Mi       3.1Gi       9.0Mi       187Mi       3.0Gi
Swap:          3.9Gi          0B       3.9Gi

실무에서는 출력에서 free -h의 available 만 본다.</pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">Swap 정보</h4>



<p>Swap(스왑)은 리눅스에서 <strong>메모리(RAM)가 부족할 때 사용하는 디스크 공간</strong>으로 쉽게 말하면 RAM의 임시 확장 공간입니다.</p>



<p>RAM이 부족하면 운영체제는 <strong>일부 데이터를 디스크로 옮겨서 공간을 확보</strong>합니다.</p>



<p>이 디스크 공간을 <strong>Swap</strong>이라고 합니다.</p>



<p>RAM = 4GB<br>프로그램 실행 = 5GB 필요<br>4GB → RAM<br>1GB → Swap<br>RAM 부족 → 일부 데이터를 디스크로 이동</p>



<p>단, Swap은 <strong>디스크</strong>를 사용하기 때문에 매우 느립니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">MiB Swap:   4008.0 total,   4008.0 free,      0.0 used.   3109.2 avail Mem</pre>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>의미</th></tr></thead><tbody><tr><td>total</td><td>swap 전체</td></tr><tr><td>free</td><td>남은 swap</td></tr><tr><td>used</td><td>사용된 swap</td></tr><tr><td>avail Mem</td><td>실제 사용 가능한 메모리</td></tr></tbody></table></figure>



<p>현재 상태</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>값</th></tr></thead><tbody><tr><td>swap total</td><td>4GB</td></tr><tr><td>swap used</td><td>0</td></tr></tbody></table></figure>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>swap 사용 없음 (아주 좋은 상태)</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h3 class="wp-block-heading">5&#x20e3; 프로세스 정보 영역 (Process List)</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">   PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     28 root      20   0       0      0      0 I   0.3   0.0   0:00.17 kworker/1:0-events
      1 root      20   0   49176  40952  10468 S   0.0   1.1   0:02.13 systemd
.... 생략</pre>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th>의미</th></tr></thead><tbody><tr><td>PID</td><td>프로세스 ID</td></tr><tr><td>USER</td><td>프로세스를 실행한 사용자</td></tr><tr><td>PR</td><td>프로세스 우선순위 (Priority)</td></tr><tr><td>NI</td><td>nice 값 (우선순위 조정 값)</td></tr><tr><td>VIRT</td><td>가상 메모리 사용량</td></tr><tr><td>RES</td><td>실제 RAM 사용량</td></tr><tr><td>SHR</td><td>다른 프로세스와 공유하는 메모리</td></tr><tr><td>S</td><td>프로세스 상태</td></tr><tr><td>%CPU</td><td>CPU 사용률</td></tr><tr><td>%MEM</td><td>메모리 사용률</td></tr><tr><td>TIME+</td><td>CPU 사용 누적 시간</td></tr><tr><td>COMMAND</td><td>실행된 명령어</td></tr></tbody></table></figure>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">PID (Process ID)</h4>



<p>프로세스의 <strong>고유 번호</strong>입니다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 리눅스에서 systemd은 항상 PID 1
# 리눅스 시스템의 최초 프로세스

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0   49176  40952  10468 S   0.0   1.1   0:02.15 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.02 kthreadd
      3 root      20   0       0      0      0 S   0.0   0.0   0:00.00 pool_workqueue_release
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-rcu_gp
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-sync_wq
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-slub_flushwq
      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-netns
      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri
     12 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-mm_percpu_wq
     14 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_kthread
     15 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_rude_kthread
     16 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_trace_kthread
     17 root      20   0       0      0      0 S   0.0   0.0   0:00.00 ksoftirqd/0
     18 root      20   0       0      0      0 I   0.0   0.0   0:00.02 rcu_preempt
     19 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_exp_par_gp_kthread_worker/1
     20 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_exp_gp_kthread_worker
     21 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration/0
     22 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/0
     23 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
     24 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1
     25 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/1
     26 root      rt   0       0      0      0 S   0.0   0.0   0:00.53 migration/1
     27 root      20   0       0      0      0 S   0.0   0.0   0:00.00 ksoftirqd/1
     29 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-events_highpri
     30 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/2
     31 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/2
     32 root      rt   0       0      0      0 S   0.0   0.0   0:00.53 migration/2
     33 root      20   0       0      0      0 S   0.0   0.0   0:00.00 ksoftirqd/2
     35 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/2:0H-events_highpri

... 생략
</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">PR (Priority)</h4>



<p>프로세스의 <strong>실제 스케줄러 우선순위</strong><br>(일반적으로 PR = 20 이 기본)</p>



<p>일반 프로세스는 PR = 20 + NI, 실시간 프로세스는 PR이 -100 등으로 낮게 표시됨</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>값</th><th>의미</th></tr></thead><tbody><tr><td>낮을수록</td><td>높은 우선순위</td></tr><tr><td>높을수록</td><td>낮은 우선순위</td></tr></tbody></table></figure>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">NI (Nice Value)</h4>



<p>CPU 우선순위를 조정하는 값 (-20 ~ 19)</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>값</th><th>의미</th></tr></thead><tbody><tr><td>-20</td><td>최고 우선순위</td></tr><tr><td>0</td><td>기본</td></tr><tr><td>19</td><td>가장 낮음</td></tr></tbody></table></figure>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">VIRT (Virtual Memory)</h4>



<p>프로세스가 확보한 가상 메모리 전체. </p>



<p>실제로 물리 메모리(RES)나 스왑을 사용하지 않더라도, 주소 공간만 확보한 경우도 포함.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">RAM
Swap
Shared library
Mapped file

#즉, 프로세스가 접근 가능한 전체 메모리 공간</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">RES (Resident Memory)</h4>



<p>실제 물리 메모리에 상주하는 크기. (프로세스가 현재 사용 중인 RAM)</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">실제 물리 메모리 사용량

systemd
RES = 40952 KB (약 40MB RAM 사용)</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">SHR (Shared Memory)</h4>



<p>공유 메모리 영역. 주로 공유 라이브러리(예: libc)가 여러 프로세스에서 공유되는 부분.</p>



<p>특히&nbsp;<code>SHR</code>은 다른 프로세스와 공유되므로, 모든 프로세스의 SHR을 합치면 전체 메모리보다 커질 수 있습니다. (중복 포함)</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">대표적으로 shared library 
libc
glibc</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">S (Process State)</h4>



<p>프로세스 상태를 나타냅니다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>상태</th><th>의미</th></tr></thead><tbody><tr><td>R</td><td>Running (실행 중)</td></tr><tr><td>S</td><td>Sleeping (대기 상태)</td></tr><tr><td>D</td><td>I/O 대기</td></tr><tr><td>T</td><td>중지됨</td></tr><tr><td>Z</td><td>Zombie</td></tr><tr><td>I</td><td>Idle kernel thread</td></tr></tbody></table></figure>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">%CPU</h4>



<p>프로세스가 사용한 <strong>CPU 비율</strong></p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">%MEM</h4>



<p>전체 메모리 중 해당 프로세스가 사용하는 비율</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">TIME+</h4>



<p>프로세스가 사용한 <strong>총 CPU 시간</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">TIME+ 형식 / 분:초.센티초

0:02.13 => 2.13초 동안 CPU 사용
1:30.00 => 1분 30초</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">COMMAND</h4>



<p>실행 중인 <strong>프로그램 이름</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">systemd
kworker
sshd
bash</pre>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> top에서 자주 보이는 커널/시스템 프로세스 10개</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>프로세스</th><th>역할</th></tr></thead><tbody><tr><td>systemd</td><td>시스템 관리자</td></tr><tr><td>kworker</td><td>커널 작업 처리</td></tr><tr><td>ksoftirqd</td><td>인터럽트 처리</td></tr><tr><td>rcu</td><td>동시성 관리</td></tr><tr><td>migration</td><td>CPU 작업 이동</td></tr><tr><td>kthreadd</td><td>커널 스레드 생성</td></tr><tr><td>kswapd</td><td>swap 관리</td></tr><tr><td>kcompactd</td><td>메모리 정리</td></tr><tr><td>cpuhp</td><td>CPU hotplug 관리</td></tr><tr><td>idle_inject</td><td>CPU idle 관리</td></tr></tbody></table></figure>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">systemd</h4>



<p>리눅스 시스템의 첫 번째 프로세스 (PID 1)</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 역할 - 리눅스 전체 시스템 관리자
시스템 초기화
서비스 관리
데몬 실행
시스템 종료 관리

# 예
systemctl start sshd
systemctl stop httpd</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">kworker</h4>



<p>커널의 백그라운드 작업 처리 스레드 / 특정 CPU에 바인딩된 워커 스레드</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">kworker/1:0-events

# 역할
비동기 커널 작업 처리
장치 드라이버 작업
I/O 처리

kworker/1:0처럼 숫자가 붙은 것이 바인딩된 워커
ukworker/u512처럼 u가 붙은 것은 unbound(특정 CPU에 바인딩되지 않은) 워커</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">ksoftirqd</h4>



<p>소프트웨어 인터럽트 처리 스레드</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ksoftirqd/0

# 역할
네트워크 패킷 처리
인터럽트 후 작업 처리
soft interrupt 처리</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">rcu</h4>



<p>멀티코어 환경에서 데이터 동기화</p>



<p>RCU (Read Copy Update) 관리 스레드 &#8211; RCU는 리눅스 커널의 <strong>동시성 제어 기술</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">rcu_preempt
rcu_tasks_kthread</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">migration</h4>



<p>CPU 작업 이동 관리 &#8211; 프로세스를 다른 CPU 코어로 이동</p>



<p>CPU 간 부하 분산(load balancing)을 위해 프로세스를 이동시킨다.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">migration/0
migration/1

CPU load balancing</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">kthreadd</h4>



<p>PID 2 </p>



<p>커널 스레드의 부모 프로세스로 모든 커널 스레드 생성</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">kswapd</h4>



<p>메모리 관리 스레드 / 메모리 부족 시 swap 관리</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">RAM 부족
→ 페이지 교체
→ swap 사용</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">kcompactd</h4>



<p>메모리 조각 정리 스레드 / 메모리 조각화 해결</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">큰 메모리 블록 필요
→ 메모리 재배치</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">cpuhp</h4>



<p>CPU Hotplug 관리 / CPU 활성화/비활성화 관리</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">cpuhp/0

CPU online/offline</pre>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading">idle_inject</h4>



<p>CPU idle 상태 관리 / CPU 전력 관리</p>



<p>CPU가 유휴 상태일 때 전력 절감을 위해 idle을 주입하는 스레드</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">CPU idle 상태 유지</pre>



<p></p>
<p>The post <a href="https://lycos7560.com/etc/top-%eb%aa%85%eb%a0%b9%ec%96%b4-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac-linux-top/40541/">top 명령어 핵심 정리 &#8211; Linux top</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/etc/top-%eb%aa%85%eb%a0%b9%ec%96%b4-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac-linux-top/40541/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
