자주 사용하는 자작 스크립트들
(evanhahn.com)- 10년 이상 dotfiles를 유지하면서 작성한 다양한 shell 스크립트 중 가장 많이 쓰는 것들을 소개함
- 클립보드·파일 관리·인터넷·텍스트 처리·REPL 런처·날짜/시간·AV·프로세스·퀵 레퍼런스·시스템·그랩백으로 나뉘며, 각 스크립트는 짧은 래퍼 형태와 실전 예시 중심으로 제시
- 대부분의 스크립트는 macOS와 Linux에서 작동하며, 핵심 철학은 “이미 있는 도구의 번거로운 자질구레함을 평탄화”하는 것
-
pbcopy/xclip,python3 -m http.server,yt-dlp,ffmpeg,mpv등 표준 유틸 통합
-
- 가장 많이 쓰는 것으로
copy/pasta/pastas/cpwd,mkcd/tempe/trash/mksh,serveit/getsong/getpod/getsubs,scratch/straightquote/markdownquote,timer/boop/tunes등
내 dotfiles를 유지하며 만든 가장 자주 쓰는 스크립트 소개
- 10년 넘게 개인 dotfiles를 관리하면서 만들어 온 다양한 shell 스크립트 중, 자주 사용하는 스크립트들을 분야별로 정리함
- 각 스크립트는 목적, 사용 빈도, 대표 예시를 함께 제공하여 즉시 적용 가능성을 높임
- 공통 목표는 반복 작업 단축, 플랫폼 간 추상화, 안전성·가독성 향상임
클립보드 관련 스크립트
-
copy와pasta: 시스템 클립보드 매니저를 감싸는 래퍼로, macOS의pbcopy나 Linux의xclip을 기반으로 함-
copy: 출력을 클립보드로 복사 -
pasta: 클립보드에서 텍스트를 가져와 출력 - 예:
run_some_command | copy,pasta > file.txt,vim "$(pasta)",pasta | base64 --decode
-
-
pastas: 클립보드 상태가 변경될 때마다 새로운 내용을 실시간으로 출력하는 툴- 복사한 모든 링크를 파일로 저장하거나, 복수의 링크를 일괄 다운로드할 때 유용함
- 예:
pastas > everything_i_copied.txt,pastas | wget -i -
-
cpwd: 현재 디렉터리 경로를 클립보드에 복사- 여러 터미널 탭에서 디렉터리 이동 시 편리함
파일 관리 스크립트
-
mkcd foo: 디렉터리 생성 및 즉시 이동 (mkdir foo && cd foo단축) -
tempe: 임시 디렉터리로 이동 (cd "$(mktemp -d)"), 샌드박스 환경에서 임시작업 시 정리 필요 없음- 예:
# Download a file and extract it tempe wget 'https://example.com/big_file.tar.xz' tar -xf big_file.tar.xz # ...do something with the file... # Write a quick throwaway script to try something out tempe vim foo.py python3 foo.py
- 예:
-
trash: 파일을 휴지통으로 이동(macos/Linux 지원), 단순rm대비 실수 방지용 -
mksh: 새로운 shell script 파일을 생성하고, 실행 가능하게 설정하며, 에디터로 즉시 열기
인터넷 관련 스크립트
-
serveit: 로컬 디렉터리에서 정적 파일 서버 구동 (기본 8000번 포트, Python 미설치 시 대체) -
getsong은yt-dlp로 최고 음질 음원 다운로드를 수행 -
getpod는 영상을 팟캐스트용 오디오로 받는 래퍼 -
getsubs는 공식 자막 우선·자동 자막 폴백 로직으로 영문 자막 추출을 수행. 요약 파이프라인과 백업 용도에 적합함- 예 :
getsubs https://video.example/foo | ollama run llama3.2 "Summarize this"
- 예 :
-
wifi off/on/toggle: 시스템 WiFi 제어, 네트워크 문제 해결 시 사용 -
url: URL 문자열을 파싱하여 프로토콜, 호스트명, 경로, 쿼리, 해시 등 분리 및 추출
텍스트 가공 스크립트
-
line 10: 표준 입력에서 특정 줄 출력 (head,tail과 유사) -
scratch:$EDITOR $(mktemp)와 같이 임시 텍스트 버퍼를 Vim에서 빠르게 여는 용도, 일회성 필기나 작은 변환 작업에 적합 -
straightquote: 스마트 인용부호를 일반(직선) 인용부호로 변환, 코드 내 인용부호 문제 방지 및 파일 용량 축소 -
markdownquote: 각 줄 앞에>붙여서 Markdown 인용문 생성 -
length: 입력 문자열의 길이 반환 (wc -c대체 가능) -
jsonformat: JSON 데이터를 예쁘게 출력 -
uppered/lowered: 문자열을 대문자/소문자로 변환 -
nato bar: 입력 문자열을 NATO 알파벳 코드로 변환 (Bravo Alfa Romeo등) -
u+ 2025: 유니코드 문자의 이름과 기호 조회 -
snippets foo: 특정 단축 문구를 개인 스니펫 사전에서 불러오기-
snippet arrow는 화살표→,snippet recruiter는 “not interested” 같은 템플릿 메시지
-
REPL 런처 관련
- Ruby의
irb에서 영감받아 다양한 언어의 REPL을 빠르게 실행:-
iclj: Clojure -
ijs: Deno(없으면 Node) -
iphp: PHP -
ipy: Python -
isql: SQLite(Bash에서 메모리 모드)
-
날짜 및 시간 스크립트
-
hoy: 현재 날짜를 ISO 형식(예시: 2020-04-20)으로 출력, 파일명 등 접두어로 활용 -
timer 10m: 시간 타이머(10분 등), 완료 시 소리와 OS 알림 전송 -
rn:date와cal을 활용해 현재 시각과 월간 달력을 보기 좋게 출력
오디오, 비디오, 이미지 처리
-
ocr: macOS에서 이미지 파일의 텍스트 추출(확장 예정) -
boop: 직전 명령 성공/실패에 따라 소리 알림(테스트 실행 뒤 등에서 직관적 활용) -
sfx: 특정 효과음 파일(.ogg)을 재생,boop,timer와 연계 -
tunes:mpv로 오디오 파일 재생(셔플 지원) -
pix:mpv로 사진 보기 -
radio: 선호하는 인터넷 라디오 스테이션 퀵 런처 -
speak: stdin에서 읽은 텍스트의 Markdown 제거 후 음성합성(TTS) -
shrinkvid:ffmpeg로 영상 파일 압축 -
removeexif: JPEG에서 EXIF 데이터 삭제, 향후 다양한 포맷 지원 예정 -
tuivid: 터미널 내에서 영상 시청, 실사용 적으나 독특한 기능
프로세스 관리
-
each:xargs,find ... -exec의 대안, 복잡한 명령어 실행을 쉽게 수행 -
running foo: 지정 키워드로 실행 중 프로세스(PID, 명령 등) 검색 후 읽기 쉬운 형태로 출력 -
murder:kill의 감싸기, 순차적으로 부드러운 시그널부터 강제로 점진 종료. 프로그램 종료 요청 시 실수 방지 -
waitfor $PID: 지정한 PID가 종료될 때까지 대기, 계속 깨어 있는 상태 유지 -
bb my_command: 명령어를 진짜 백그라운드 모드로 실행, 데몬 등의 실행에 적합 -
prettypath:$PATH를 줄바꿈으로 한눈에 보기 쉽게 출력(디버깅 시 유용) -
tryna my_command/trynafail my_command: 명령어 성공 시까지 반복(run until success), 실패 시까지 반복(run until fail), 네트워크 등 다양한 자동화에 응용
빠른 참조 툴
-
emoji: 키워드로 emoji 검색 및 출력 -
httpstatus: 모든 HTTP 상태코드 목록 출력, 특정 코드 설명 확인 -
alphabet: 영문 알파벳 소문자·대문자 전체 출력(의외로 사용 빈번)
시스템 관리
-
theme 0/theme 1: 시스템 전체 테마(다크/라이트) 변경, Vim, Tmux 등 연계 -
sleepybear: 시스템 슬립 모드 진입(macOS, Linux) -
ds-destroy:.DS_Store파일 재귀 삭제, macOS 사용자 폴더 정리 시 유용
기타
-
catbin foo: PATH 내 파일의 소스코드 바로 보기 -
notify: OS 수준 알림 전송, 장시간 작업 완료 시 바로 알림 -
uuid: 버전 4 UUID 생성
결론
- 이 글에 소개된 스크립트들은 필자가 실제로 자주 활용하는 도구임
- 직접 만든 단축 명령 스크립트는 업무 효율화, 실수 방지, 생산성 향상에 매우 효과적
- 여러분도 자신만의 자동화 스크립트를 만들어 활용하는 것을 추천
Hacker News 의견
-
trash a.txt b.png 명령은
a.txt와b.png파일을 휴지통으로 옮기는 것임, Mac과 Linux에서 지원함. 내가 예전에 하던 방식은 파일 별로 순차적으로 처리하기 때문에 삭제 소리가 각 파일마다 들리고, Finder의 ⌘Z로 마지막 파일만 복구가 가능함. 개선은 할 수 있지만, 사실 macOS에 기본 내장된 공식trash명령을 쓰는 게 더 편리함. Finder를 쓰지 않으니 소리나 ⌘Z 복구는 없지만 속도도 빠르고 “Put Back” 기능도 됨. 그리고 JSON pretty-print는 node 말고 jq를 쓴다면 훨씬 더 짧은 코드로 해결 가능하고, 요즘 macOS에는 jq가 미리 설치되어 나옴. uuid 프린트도 마찬가지로 v4 UUID가 필요할 땐 uuidgen을 쓰는 것이 무난함(man page 참고)-
셀프 스크립트보다 기본 내장 기능을 쓰는 게 더 나을 때가 많음. 예를 들어 vim에서 markdownquote를 쓰는 대신 ctrl-v로 첫 열을 선택하고 "i> " 후 escape만 누르면 됨. 더 짧고 효율적임. u+ 2025가 왜 ñ를 반환하는지 궁금한데 실제 유니코드 값은 U+00F1 임. 그리고 catbin foo는 cat "$(which foo)"와 같음. zsh를 쓴다면 cat =foo가 더 짧고 강력함. zsh에서는 = 뒤에 자동 완성이 되어서 긴 명령어에도 안전하게 쓸 수 있음. 나는 file =firefox, vim =myscript.sh처럼 자주 씀
-
나는 저자가 uuidgen을 몰랐을 것이라 추측함. 이런 지식이나 설정을 공유하면 항상 내 사각지대가 밝혀지는 점이 좋아서 공유가 중요한 것임
-
파이썬도 기본적으로 JSON을 pretty-print 가능함
$ echo '{ "hello": "world" }' | python3 -m json.tool { "hello": "world" } -
trash정보 고마움. 나는 그동안 "tell app "Finder" to move {%s} to trash" 식으로 AppleScript를 써서 여러 파일을 휴지통에 보냈음 -
rm과 trash의 대안으로 rip도 추천함 rip 프로젝트 링크
-
-
개발자의 인생 사이클이 참 신기함. 처음에는 바닐라 셸 환경만 쓰다가, 1~2년 차에는 스크립트와 bash alias를 수백 줄씩 만들어 씀. 15년 차가 된 지금은 오히려 최대한 기본 셸만 쓰고, alias도 안 쓰며, 복잡한 것은 Python이나 Go로 처리함
-
이런 경향은 뭔가 각성한 상태라기보다는 그냥 게으름에서 오는 것 같음(나도 똑같이 해서 하는 말임). 커스텀 환경을 파고드는 동료들 덕분에 새로운 도구들을 자주 배우게 되고, 최근에는 atuin, fzf 같은 도구도 리눅스에 추가함
-
dotfile에 alias랑 function을 적어서 자주 쓰는 명령어를 기록/기억하는 용도로 씀. 자주 쓰는 도구 모음을 계속 업데이트하고, 새 워크스테이션에 이전하는 것도 쉬움
-
예전에 nix 컴퓨터가 한 대만 있었을 때는 커스텀을 많이 하고 싶었음. 지금은 여러 대를 동시에 쓰다 보니 필요한 패키지만 설치해서 환경을 통일함
-
python으로 짠 것도 여전히 script라고 부름. script라는 용어가 쉘 스크립트에만 한정된 건 아니라고 생각함
-
요즘은 젊은 엔지니어들과 일하면서 그들이 여러 dotfiles를 쓰는 걸 보면 “나도 옛날엔 저렇게 했었지, 귀찮았지”라고 느낌. 이제는 툴을 선별적으로 사용하고, 필요한 것에 유연하게 맞춤. 다른 사람 스타일도 존중함
-
-
이런 실전 팁 게시글을 HN에서 찾는 게 정말 좋음. 다른 개발자들이 실제로 어떻게 일하는지, 내가 뭘 배워서 적용할 수 있을지 궁금함. 처음에는 “나한텐 필요 없겠지”라고 생각해도, 어떤 작업이 수월해지면 그 작업 자체가 새로운 워크플로우를 만듦. 그래서 일단 해보고 맞는 걸 남기는 편임. 원글의 스타일도 마음에 듬—실제 사용 빈도를 같이 적어준 점이 진짜 실용적임. 나는 간단한 작업은 브라우저 devtools 열어서 JavaScript로 끝내는 경우가 많음. (예: 문자열을 소문자로 변환할 때 등)
-
저자 방식과 내 방식의 소요 시간, 스크립트 제작/기억/참조/마이그레이션 비용까지 따져서 실제 cost-benefit analysis를 해보면 흥미로울 것 같음
-
이 Bash 단축키 치트시트 이미지가 많은 도움이 됨
-
-
line 스크립트 대신, sed로 특정 줄 출력이 더 간단함
sed -n 2p file두 번째 줄 출력 가능. 여러 줄 출력도
sed -n 2,4p file처럼 할 수 있어서 line 스크립트보다 유리함
- sed 명령어를 여러 개 묶어서 쓸 일이 많음. 그럴 때마다 첫 sed 명령을 계속 바꿔야 함. 때론 sed 전에 grep이 필요할 때도 있는데, cat, tail, head로 쪼개면 각 기능을 모듈처럼 써서 더 유연해짐. 각각이 한 가지 일만 하도록 만드는 유닉스 철학에 맞음
-
내가 자주 쓰는 간단한 스크립트들이 있음. 예를 들어:
#!/usr/bin/env bash # ~/bin/,dehex echo "$1" | xxd -r -p#!/usr/bin/env bash # ~/bin/,ht highlight() { # 색상: 30=검정, 31=빨강, 32=초록, ... escape=$(printf '\033') sed "s,$2,${escape}[$1m&${escape}[0m,g" } if [[ $# == 1 ]]; then highlight 31 $1 elif [[ $# == 2 ]]; then highlight 31 $1 | highlight 32 $2 elif [[ $# == 3 ]]; then highlight 31 $1 | highlight 32 $2 | highlight 35 $3 elif [[ $# == 4 ]]; then highlight 31 $1 | highlight 32 $2 | highlight 35 $3 | highlight 36 $4 fi개인 스크립트는 ,(콤마)로 앞에 붙여두어 빠르게 전환할 수 있음. 나만의 스크립트들을 히스토리에서 주기적으로 통계 내보고, 더는 안 쓰는 것들은 정리하는 작업이 가치 있다고 느낌
-
아직 일반화는 못했지만
unmv스크립트로 꽤나 편리하게 작업하고 있음#!/bin/sh if test "$#" != 2 then echo 'Error: unmv must have exactly 2 arguments' exit 1 fi exec mv "$2" "$1" -
좋은 팁들이 많지만, 나는 대체로 표준 유틸리티(sed, awk, grep, xargs 등)를 배우고 씀. 이유는 여러 시스템을 오가며 작업을 하는데, 내 개인 스크립트와 alias들은 대부분 미설치되어 있기 때문임. 표준 유틸로 거의 모든 일을 할 수 있음
- 정말 공감함. 어디서든 작업할 수 있도록 표준만 쓰게 됨. 하지만 정말 잘 만든 도구는 결국 기본 설치나 apt-get 설치가 쉬워지기도 함. 개인 스크립트 모음보다는, 관리 잘 되는 패키지 형태가 더 바람직하다고 생각함
-
내가 제일 좋아하는 압축 해제 스크립트 공유함
# ex - archive extractor # 사용법: ex <파일> function ex() { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xjf $1 ;; *.tar.gz) tar xzf $1 ;; *.tar.xz) tar xf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1;; *.7z) 7z x $1 ;; *) echo "'$1' cannot be extracted via ex()" ;; esac else echo "'$1' is not a valid file" fi }-
이걸 압축하는 반대 counterpart도 만들고 싶음
-
나는 dtrx를 쓰는데, 자동으로 압축을 폴더 안에 풀어줘서 좋음
-
나는 aunpack이 더 편함
-
정말 깔끔함
-
inotify와 systemd user service까지 추가하면 한 단계 진화할 듯함. 이미 패키지로 존재하는 버전도 있음. 직접 만드신 것은 정사각형 바퀴(재발명) 느낌
-
-
mp4 인코딩이나 자르기에 항상 쓰는 두 가지 함수가 있음. flag 덕분에 WhatsApp, 모바일 Discord 등 다양한 환경에서 호환성이 극대화됨
ffmp4() { input_file="$1" output_file="${input_file%.*}_sd.mp4" ffmpeg -i "$input_file" -c:v libx264 -crf 33 -profile:v baseline -level 3.0 -pix_fmt yuv420p -movflags faststart "$output_file" echo "Compressed video saved as: $output_file" } ffmp4 foo.webm # foo_sd.mp4로 변환fftime() { input_file="$1" output_file="${input_file%.*}_cut.mp4" ffmpeg -i "$input_file" -c copy -ss "$2" -to "$3" "$output_file" echo "Cut video saved as: $output_file" } fftime foo.mp4 01:30 01:45 # foo_cut.mp4 생성fftime은 원본을 다시 인코딩하지 않고 빠르게 자르지만, 영상에 따라 약간 문제(재생 불가 등)가 있을 수 있음. 재인코딩하려면 -c copy를 빼면 됨
-
alias나 function을 만들고 테스트할 때마다
~/.zshrc를 바로 반영하는 게 편해서 아래처럼 쓴 alias를 씀alias vz="vim ~/.zshrc && . ~/.zshrc"그리고 Mac에서 docx 파일 grep용으로 아래 function을 씀
docgrep() { mdfind "\"$@\"" -onlyin /Users/xxxx/Notes 2> >(grep --invert-match ' [UserQueryParser] ' >&2) | grep -v -e '/Inactive/' | sort }또, 내 Mac의 클립보드를 익명화해서 ChatGPT나 사내 Slack 등 공개 채널에 붙여넣을 때, 디버깅 용도로 아래 함수를 돌림. 함수 실행하면 새로 변환된 클립보드를 stdout에 표시 해주기 때문에, 놓친 부분이 있는지 확인 가능함
anonymizeclipboard() { my_user_id=xxxx account_ids="1234567890|1234567890" #regex corp_words="xxxx|xxxx|xxxx|xxxx|xxxx" #regex project_names="xxxx|xxxx|xxxx|xxxx|xxxx" # regex pii="xxxx|xxxx|xxxx|xxxx|xxxx|xxxx" # regex hostnames="xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx" # regex pbpaste | sed -E -e 's/([0-9]{1,3})\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/\1.x.x.x/g' \ -e "s/(${corp_words}|${project_names}|${my_user_id}|${pii}|${hostnames})/xxxx/g" -e "s/(${account_ids})/1234567890/g" | pbcopy pbpaste } alias anon=anonymizeclipboard- 이거 진짜 좋음. 이런 일이 자주 생기는데 마땅한 방법을 못 찾아서 애먹었음