냥아치 (59.♡.163.88)
2025년 12월 20일 AM 10:48 · 수정됨(12:34)
쉘 스크립트는 업무용 보다는 개인 용도로만 사용하는 편입니다..
그래서 당장 필요한 것만 쓰고 에러 처리라든가 예외 처리 등은 그냥 등한시 하고 넘어가는 편인데요,
이번에 디렉토리 여기저기서 파일들을 끌고 와서 백업 압축 파일을 만드는 간단한 작업을 한 다음에
파일명에 오늘 날짜 박는 작업이 귀찮아서 (...) 채찍피티에 던져줬더니 예상치 못하게 잘 짜주네요.
1.
갑자기 쉘 스크립트가 아래 내용으로 시작합니다.
set -euo pipefail
아따 시방 이건 뭐시여? 하고 다시 채찍피티한테 물어보니 상세하게 설명해줍니다.
- set -e → 실행 중인 명령이 하나라도 실패하면 스크립트 종료
- set -u → 정의되지 않은 변수 사용 시 오류 처리 (오타 방지)
- set -o pipefail → 파이프라인( | ) 으로 연결된 명령 중 하나라도 실패하면 전체 실패로 간주
실행 중 오류 발생 시 보다 엄격하게 처리하고 중지해줍니다.
보기엔 간단해 보이지만 자그마치 세 개의 옵션이 합쳐진 컴비네이션!!
2.
백업 파일 압축 전 모아놓은 파일 들 중에서 불필요한 디렉토리들을 삭제하는 명령이 하나 있습니다.
아래와 같이 .trash 란 이름의 디렉토리는 다 찾아내서 삭제하라는 코드인데요.
rm -rf `find . -name '.trash'`
이걸 아래와 같이 바꿔놓더군요?
find . -name '.trash' -type d -prune -exec rm -rf {} +
요것도 다시 물어보니 의도치 않은 이름의 디렉토리에 의한 오동작을 막고 불필요한 작업을 막기 위한 거라고 하네요.
- -type -d → 디렉토리에 대해서만 처리
- -prune → .trash 디렉토리를 만나면 그 아래로는 검색하지 않음 (어차피 함께 삭제될 거니까)
- -exec rm -rf {} + → find에 의한 검색 결과를 rm 명령의 인자로 안전하게 넘김
여기서 마지막에 '안전하게' 넘긴다는 뜻은, 디렉토리 경로 명에 한글, 공백 또는 특수문자가 섞여서 잘못 구분되는 것을 방지한다는 뜻입니다.
( /data/냥아치 야동 모음/.trash 란 디렉토리가 있으면 이걸 하나로 처리해야지
/data/냥아치, 야동, 모음/.trash 세개로 쪼개져서 처리하는 걸 막겠다는 ..)
업무 상 쉘 스크립트를 자주 사용하시는 분들께는 익숙하실 내용이겠지만
초짜 입장에서는 갑자기 코드 수준이 상승하는 기분을 맛보았습니다 (어깨 으쓱).
댓글 (6)
-
Rrouting
25.12.20 · 121.♡.129.147
맞아요 특히 rm rf는 지옥을 볼 수 있으니까요. -
냥냥아치
→ routing 작성자
25.12.20 · 59.♡.163.88
물론 find 로 삭제할 대상을 미리 확인한 다음 처리합니다. ^^v -
4404page
25.12.20 · 211.♡.225.193
운영 입장에서는 rm -rf 는 사실상 그냥 죽음아닌가요?ㅎ -
냥냥아치
→ 404page 작성자
25.12.20 · 59.♡.163.88
제가 그 미친 짓을 스스럼 없이 합니다
물론 개인 파일이니 그렇지만요 ㅎ - 긴
긴급휴무
25.12.20 · 211.♡.71.91
백업과 클린업은 다르니...
저라면 백업 할때에 트래시 디렉토리는 제외하고 압축하겠습니다. -
냥냥아치
→ 긴급휴무 작성자
25.12.20 · 59.♡.163.88
유지 관리 업무 수준 대로라면 애초부터 세세하게 골라서 모으는게 확실하겠죠
댓글을 작성하려면 이 필요합니다.