๊ฐœ๋ฐœ๋…ธํŠธ/Linux

[Linux] Shell Function - alias๋ฅผ ๋„˜์–ด “๋ฆฌ๋ˆ…์Šค๋ฅผ ๋‚ด ๋ช…๋ น์ฒ˜๋Ÿผ” ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ  ๐Ÿ”ง

๋กœ๋กœ๋ฝœ 2025. 12. 25. 07:30

Shell Function์€ alias๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ๋ฆฌ๋ˆ…์Šค ์ž๋™ํ™” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์–ด ๋ฌถ๊ธฐ, ์ธ์ž ์ฒ˜๋ฆฌ, ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™œ์šฉ, bash·zsh ํ•จ์ˆ˜ ์ž‘์„ฑ๋ฒ•๊ณผ ์‹ค์ „ ์˜ˆ์ œ๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

shell function์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ
Shell Function ํ•„์š”์„ฑ

๋ฆฌ๋ˆ…์Šค๋ฅผ ์–ด๋А ์ •๋„ ์“ฐ๋‹ค ๋ณด๋ฉด ๋ฐ˜๋“œ์‹œ ๋ถ€๋”ชํžˆ๋Š” ์ˆœ๊ฐ„์ด ์žˆ๋‹ค.

  • alias ๋งŒ์œผ๋กœ๋Š” ์ธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ณ 
  • ์กฐ๊ฑด๋ฌธ·๋ฐ˜๋ณต๋ฌธ ๊ฐ™์€ ๋กœ์ง๋„ ๋„ฃ์„ ์ˆ˜ ์—†๊ณ 
  • ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ๋ฌถ์–ด ์ž๋™ํ™”ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค

์ฒ˜์Œ์—๋Š” alias๊ฐ€ ๊ฝค ํŽธํ•˜๋‹ค.
ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์„ ์˜ค๋ž˜ ํ• ์ˆ˜๋ก alias์˜ ํ•œ๊ณ„๋Š” ๋ช…ํ™•ํ•ด์ง„๋‹ค.

์ด๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ Shell Function(์…ธ ํ•จ์ˆ˜)์ด๋‹ค.

์…ธ ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํ•œ ๋‹จ์ถ• ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ,
“๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ์ƒˆ ๋ช…๋ น์–ด์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด ์“ฐ๋Š” ๋ฐฉ๋ฒ•”์ด๋‹ค.

์ด ๊ธ€์—์„œ๋Š” bash·zsh ๊ธฐ์ค€์˜ Shell Function ๋ฌธ๋ฒ•, ์ธ์ž ์ฒ˜๋ฆฌ, return, ์‹ค์ „ ์˜ˆ์ œ,
๊ทธ๋ฆฌ๊ณ  ํ˜„์—… ๊ฐœ๋ฐœ์ž๋“ค์ด ์‹ค์ œ๋กœ ์“ฐ๋Š” ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•๊นŒ์ง€ ๋ชจ๋‘ ์ •๋ฆฌํ•œ๋‹ค.


1. Shell Function์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด์ฒ˜๋Ÿผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์…ธ์˜ ๊ธฐ๋Šฅ

์˜ˆ:

hello() {
    echo "Hello Roroppwa!"
}
 

์‹คํ–‰:

hello
 

์ถœ๋ ฅ:

Hello Roroppwa!

์ฆ‰, ์ƒˆ๋กœ์šด “๋ช…๋ น์–ด”๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

alias๋Š” ๋‹จ์ˆœ ํ…์ŠคํŠธ ์น˜ํ™˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ “๋ถˆ๊ฐ€๋Šฅ”ํ•˜๋‹ค:


๊ธฐ๋Šฅ alias function
์ธ์ž ์ฒ˜๋ฆฌ โŒ โœ”
์กฐ๊ฑด๋ฌธ(if) โŒ โœ”
๋ฐ˜๋ณต๋ฌธ(for/while) โŒ โœ”
์—ฌ๋Ÿฌ ๋ช…๋ น ๋ฌถ๊ธฐ ๋งค์šฐ ์ œํ•œ์  โœ” ์™„์ „ ๊ฐ€๋Šฅ
์œ ์ง€๋ณด์ˆ˜ ๋‚ฎ์Œ ๋†’์Œ

๋”ฐ๋ผ์„œ ๋ฆฌ๋ˆ…์Šค๋ฅผ ์กฐ๊ธˆ์ด๋ผ๋„ ๊นŠ๊ฒŒ ๋‹ค๋ฃจ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ
alias → function ์ˆœ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ฒŒ ๋œ๋‹ค.

 


2. Shell Function ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

POSIX ์…ธ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•๊ณผ function ๋ฌธ๋ฒ•์„ ๊ฐœ๊ตฌ๋ฆฌ ์บ๋ฆญํ„ฐ๊ฐ€ ๋น„๊ตํ•˜๋Š” 4์ปท ์›นํˆฐ
Shell Function ๋ฌธ๋ฒ• ๋น„๊ต

(1) POSIX ๊ถŒ์žฅ ๋ฌธ๋ฒ•

myfunc() {
    echo "Run myfunc"
}
 

(2) function ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

function myfunc {
    echo "Run myfunc"
}
 

๋‘˜ ๋‹ค ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

โ€ป POSIX ํ˜ธํ™˜์„ฑ์„ ์ƒ๊ฐํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ๋ฌธ๋ฒ•์„ ๊ถŒ์žฅํ•จ.


3. Shell Function์€ ์–ด๋””์— ์ €์žฅํ•˜๋‚˜?

์— ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ํ˜„์žฌ ํ™˜๊ฒฝ์—๋งŒ ์ ์šฉ๋œ๋‹ค.
ํ„ฐ๋ฏธ๋„์„ ๋‹ซ์œผ๋ฉด ์‚ฌ๋ผ์ง„๋‹ค.

์ง€์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜ ํŒŒ์ผ์— ๋„ฃ์–ด์•ผ ํ•œ๋‹ค:

  • bash ์‚ฌ์šฉ์ž: ~/.bashrc
  • zsh ์‚ฌ์šฉ์ž: ~/.zshrc

์…ธ ํŒŒ์ผ

์…€ ํŒŒ์ผ
bash ~/.bashrc
zsh ~/.zshrc

์˜ˆ:

nano ~/.zshrc
 

์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€:

backup() {
    cp "$1" "$1.bak"
}
 

์ ์šฉ:

source ~/.zshrc
 

4. ํ•จ์ˆ˜์—์„œ ์ธ์ž(arguments) ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•

alias์™€ function์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š”
ํ•จ์ˆ˜๋Š” ์ธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

1) ์ธ์ž๋Š” $1, $2, $3… ๋กœ ์ ‘๊ทผ

์˜ˆ:

show() {
    echo "์ฒซ ๋ฒˆ์งธ ์ธ์ž: $1"
    echo "๋‘ ๋ฒˆ์งธ ์ธ์ž: $2"
}
 

์‹คํ–‰:

show hello world
 

์ถœ๋ ฅ:

์ฒซ ๋ฒˆ์งธ ์ธ์ž: hello
๋‘ ๋ฒˆ์งธ ์ธ์ž: world
 

2) ๋ชจ๋“  ์ธ์ž ์ถœ๋ ฅ ($@)

logall() {
    echo "๋ฐ›์€ ์ธ์ž ์ „์ฒด: $@"
}
 

3) ์ธ์ž ๊ฐœ์ˆ˜($#)

countargs() {
    echo "์ธ์ž ๊ฐœ์ˆ˜: $#"
}
 

5. Shell Function ์‹ค์ „ ์˜ˆ์ œ 15๊ฐœ

์•„๋ž˜ ์˜ˆ์ œ๋Š” ๊ฐœ๋ฐœ์ž·์šด์˜์ž·์ž„๋ฒ ๋””๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด๋‹ค.

1) ๋นŒ๋“œ ๋กœ๊ทธ ์ž๋™ ์ƒ์„ฑ ํ•จ์ˆ˜

makelog() {
    make "$@" 2>&1 | tee make.log
}
 

2) ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋น ๋ฅด๊ฒŒ ์ด๋™

cdd() {
    cd ~/Desktop/Projects/"$1"
}
 

3) ์•ˆ์ „ํ•œ ํŒŒ์ผ ๋ฐฑ์—…

backup() {
    cp "$1" "$1.bak"
}
 

4) ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋‹จ์ถ• ํ•จ์ˆ˜

mps() {
    ps aux | grep "$1"
}
 

5) tar ์ž๋™ ์••์ถ•

targz() {
    tar -czvf "$1.tar.gz" "$1"
}
 

6) ๊ฐ€์žฅ ํฐ ํŒŒ์ผ 20๊ฐœ ์ฐพ๊ธฐ

big20() {
    du -ah . | sort -hr | head -20
}
 

7) Nginx ๋กœ๊ทธ tail

nginxlog() {
    tail -f /var/log/nginx/access.log
}
 

8) git ๋‹จ์ถ• ํ•จ์ˆ˜

gs() { git status; }
gc() { git commit; }
gp() { git push; }
 

9) ํŠน์ • ํฌํŠธ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์ฐพ๊ธฐ

port() {
    ss -tulnp | grep "$1"
}
 

10) ๋น ๋ฅธ ping ํ…Œ์ŠคํŠธ

p() {
    ping -c 4 "$1"
}
 

11) ์˜คํƒ€ ์ž๋™ ๊ณ ์นจ ์œ„ํ•œ wrapper

grpe() {
    grep "$@"
}
 

12) rm ๋ณดํ˜ธ ๊ธฐ๋Šฅ

safe_rm() {
    mv "$1" ~/.trash/
}
 

13) ๋‚ ์งœ ๊ธฐ๋ฐ˜ ๋ฐฑ์—…

ts_backup() {
    cp "$1" "$1_$(date +%Y%m%d_%H%M%S)"
}
 

14) PATH ์ž๋™ ์ถ”๊ฐ€ ํ•จ์ˆ˜

addpath() {
    export PATH="$1:$PATH"
}
 

15) docker ์ปจํ…Œ์ด๋„ˆ ๋น ๋ฅด๊ฒŒ ๋“ค์–ด๊ฐ€๊ธฐ

dsh() {
    docker exec -it "$1" /bin/sh
}
 

6. Shell Function์—์„œ return ์‚ฌ์šฉ๋ฒ•

Shell Function์—์„œ return, exit, ๊ทธ๋ฆฌ๊ณ  $? ์‚ฌ์šฉ๋ฒ•์„ ์š”์•ฝ
Shell Function return ๊ฐœ๋… ์š”์•ฝ

1) ์…ธ ํ•จ์ˆ˜๋Š” return ๊ฐ’์„ exit code(0~255)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

return 0   # ์„ฑ๊ณต
return 1   # ์‹คํŒจ
 

2) ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ exit ์‚ฌ์šฉํ•˜๋ฉด ์ ˆ๋Œ€ ์•ˆ ๋จ

exit๋Š” ์…ธ์„ ์ข…๋ฃŒํ•œ๋‹ค.

3) ๋งˆ์ง€๋ง‰ ๋ช…๋ น์˜ ์ƒํƒœ๋Š” $? ๋กœ ํ™•์ธ

myfunc
echo $?   # myfunc์˜ ๋ฐ˜ํ™˜๊ฐ’
 

์ด ๊ฐœ๋…์€ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ์‹œ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.


7. ์ง€์—ญ ๋ณ€์ˆ˜(local) ์‚ฌ์šฉ

zsh์™€ bash๋Š” local์˜ ๋™์ž‘์ด ์กฐ๊ธˆ ๋‹ค๋ฅด์ง€๋งŒ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์€ ๊ฐ™๋‹ค.

myfunc() {
    local msg="hello"
    echo $msg
}
 

๋Œ€๊ทœ๋ชจ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐ˜๋“œ์‹œ local์„ ์จ์•ผ ํ•œ๋‹ค.
(global ์˜ค์—ผ ๋ฐฉ์ง€)


8. Shell Function ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•

1) ํ•จ์ˆ˜ ์ •์˜ ํ™•์ธ

type myfunc
 

2) ํ•จ์ˆ˜ ์ „์ฒด ๋‚ด์šฉ ๋ณด๊ธฐ

declare -f myfunc
 

zsh์—์„œ๋Š”:

functions myfunc
 

3) ํ•จ์ˆ˜ ์‚ญ์ œ

unset -f myfunc
 

9. Shell Function์„ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

zshrc / bashrc๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.
์•„๋ž˜์ฒ˜๋Ÿผ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

~/.shell/
 โ”œโ”€ functions/
 โ”‚    โ”œโ”€ git.sh
 โ”‚    โ”œโ”€ backup.sh
 โ”‚    โ”œโ”€ docker.sh
 โ”‚    โ””โ”€ network.sh
 

zshrc์— ์ถ”๊ฐ€:

for f in ~/.shell/functions/*.sh; do
    source $f
done
 

10. OpenWrt·์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ์—์„œ Shell Function ํ™œ์šฉ

์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ํŠนํžˆ ๋น›๋‚œ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ์„ค์ • ์ž๋™ํ™”
  • ์‹œ์Šคํ…œ ๋กœ๊ทธ ์ˆ˜์ง‘
  • ๋นŒ๋“œ ์ž๋™ํ™”
  • rc.d ์Šคํฌ๋ฆฝํŠธ ๋‹จ์ถ•

์˜ˆ:

wanip() {
    ifconfig eth0 | grep "inet " | awk '{print $2}'
}
 

์ด ํ•จ์ˆ˜๋Š” BusyBox ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ž‘ํ•˜๋ฉฐ:

  • ifconfig ์—†๋Š” ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • prefix ์ œ๊ฑฐ๊นŒ์ง€ ์ž๋™ ์ฒ˜๋ฆฌ
  • ๋„คํŠธ์›Œํฌ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ

์ž„๋ฒ ๋””๋“œ ์—”์ง€๋‹ˆ์–ด๋ผ๋ฉด function ๊ธฐ๋ฐ˜ ์ž๋™ํ™”๋Š” ์‚ฌ์‹ค์ƒ ํ•„์ˆ˜๋‹ค.


11. FAQ

Q1. alias์™€ ํ•จ์ˆ˜ ์ค‘ ๋ฌด์—‡์„ ์จ์•ผ ํ•˜๋‚˜์š”?

๊ฐ„๋‹จ → alias
๋ณต์žก → ํ•จ์ˆ˜

Q2. ํ•จ์ˆ˜๋Š” ์–ด๋””์— ์ €์žฅํ•ด์•ผ ํ•˜๋‚˜์š”?

bashrc ๋˜๋Š” zshrc.

Q3. ํ•จ์ˆ˜์—์„œ ์ธ์ž๋ฅผ ๋ฌด์ œํ•œ์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‚˜์š”?

๊ฐ€๋Šฅํ•˜๋‹ค.

Q4. ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์•„๋ฌด๊ฑฐ๋‚˜ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

๋„ค, ํ•˜์ง€๋งŒ ๋ช…๋ น์–ด ์ด๋ฆ„๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜.

Q5. ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

์ด๋ฆ„๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋จ.

Q6. ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ?

๊ฐ€๋Šฅํ•˜๋ฉฐ ๋งค์šฐ ๊ฐ•๋ ฅํ•จ.

Q7. ํ•จ์ˆ˜ ์•ˆ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๋ฉด?

ํ˜„์žฌ ์…ธ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ.

Q8. exit๋ฅผ ์“ฐ๋ฉด ์•ˆ ๋˜๋‚˜์š”?

exit๋Š” ์…ธ ์ž์ฒด๋ฅผ ์ข…๋ฃŒํ•˜๋ฏ€๋กœ return ์‚ฌ์šฉ.

Q9. type์œผ๋กœ ํ•จ์ˆ˜ ํ™•์ธ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

๊ฐ€๋Šฅํ•จ.

Q10. ์ž๋™์™„์„ฑ์€ ๋ณ„๋„ ์„ค์ • ํ•„์š”?

zsh๋Š” ์ž๋™์™„์„ฑ ์ง€์›์ด ๋งค์šฐ ๊ฐ•๋ ฅํ•จ.


12. Shell Function์€ “๋ฆฌ๋ˆ…์Šค ์ž๋™ํ™”์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ ”

Shell Function์€ ๋‹จ์ˆœํ•œ ํŽธ์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋‹ค.

  • ์ธ์ž ์ฒ˜๋ฆฌ
  • ์กฐ๊ฑด๋ฌธ·๋ฐ˜๋ณต๋ฌธ
  • ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ œ์–ด
  • ๋ช…๋ น์–ด ๋ฌถ๊ธฐ
  • ์ž๋™ํ™” ๋กœ์ง ๊ตฌ์„ฑ

์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฆฌ๋ˆ…์Šค ์ž๋™ํ™”์˜ ํ•ต์‹ฌ ๋„๊ตฌ๋‹ค.

alias๊ฐ€ ๋ฆฌ๋ˆ…์Šค ์ดˆ๋ณด์ž์˜ ์‹œ์ž‘์ด๋ผ๋ฉด,
Shell Function์€ ๊ฐœ๋ฐœ์ž๋ฅผ ‘๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž’๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

“alias๋Š” ์‹œ์ž‘์ผ ๋ฟ, function์ด ์ง„์งœ ๋ฆฌ๋ˆ…์Šค ์ƒ์‚ฐ์„ฑ์„ ๋งŒ๋“ ๋‹ค.”