rm -rf "$DIR"/* 를 실행한다DIR 값을 설정하는 줄이 위에서 빠지거나 오타가 나면 $DIR 이 빈 문자열이 되고, 명령은 사실상 루트 아래 전체를 지우는 것과 같아집니다. 되돌릴 방법이 없는 사고로 이어집니다. ✅ 스크립트 앞부분에 : "${DIR:?DIR 값이 비었습니다}" 로 방어하거나, set -u 로 빈 변수 사용 자체를 에러로 만듭니다.
: "${DIR:?DIR 값이 비었습니다}" # DIR 이 비어 있으면 여기서 즉시 종료
rm -rf "$DIR"/* # 이 줄까지 오면 DIR 은 항상 값이 있다chmod 777 을 준다권한 오류가 나면 원인을 찾는 대신 777 로 모두에게 rwx 를 열어 문제를 회피하는 경우가 많습니다. 서버의 모든 사용자가 파일을 읽고 쓰고 실행할 수 있게 돼, 보안 감사에서 바로 지적됩니다. ✅ 필요한 대상에만 필요한 권한을 주고, 대부분은 750(소유자 전체, 그룹 읽기·실행) 이면 충분합니다.
root 로 띄우면 포트 제한 없이 편하고 권한 오류도 안 나서 그대로 습관이 됩니다. 애플리케이션에 취약점이 있으면 공격자가 곧바로 서버 전체 권한을 갖게 됩니다. ✅ 전용 서비스 계정(app)을 만들고, 그 계정 권한으로만 자바 프로세스를 실행합니다.
> 로 로그 파일을 실수로 덮어쓴다이어써야 할 로그에 >> 대신 > 를 쓰면 기존 내용이 그 순간 전부 사라집니다. 장애 원인을 찾아야 하는 로그가 통째로 날아가는 사고로 이어집니다. ✅ 로그처럼 누적해야 하는 파일은 항상 >> 를 쓰고, 헷갈리면 별칭이나 스크립트로 고정해 둡니다.
rm $FILE 처럼 변수를 따옴표 없이 쓰면, 값에 공백이 있을 때 셸이 여러 단어로 쪼개 엉뚱한 파일까지 지울 수 있습니다. app log.txt 는 app 과 log.txt 두 인자로 나뉩니다. ✅ 변수는 항상 "$FILE" 처럼 따옴표로 감쌉니다.
cat 으로 수 GB 짜리 로그를 그대로 연다cat huge.log 를 실행하면 터미널이 그 내용을 전부 출력하려다 멈춘 것처럼 보이고, 실제로 화면 스크롤도 감당이 안 됩니다. 원하는 내용을 찾기도 전에 터미널이 먹통이 됩니다. ✅ less huge.log 로 페이지 단위로 열거나, tail -f 로 필요한 부분만 봅니다.
ls 출력을 파싱해서 스크립트를 짠다ls -l | awk '{print $5}' 처럼 사람이 보기 좋은 출력을 파싱하면, 파일명에 공백이나 개행이 있을 때 열이 어긋나 잘못된 값을 읽습니다. 배포판마다 ls 출력 형식이 조금씩 달라 이식성도 떨어집니다. ✅ 크기가 필요하면 stat -c '%s' 파일, 목록 순회가 필요하면 find 를 씁니다.
링크를 만든 위치와 다른 디렉터리에서 상대 경로 링크를 참조하면 대상을 못 찾습니다. current -> releases/v2 링크만 다른 폴더로 옮기면 깨지는 것이 대표적입니다. ✅ 배포처럼 위치가 고정된 경우는 절대 경로로 만들거나, ln -sfn 을 같은 부모 디렉터리 안에서만 씁니다.
PATH 를 통째로 덮어쓴다export PATH=/opt/jdk/bin 처럼 기존 값 없이 다시 대입하면 ls, cd, grep 같은 기본 명령 경로까지 사라집니다. 그 순간부터 셸의 거의 모든 명령이 command not found 가 됩니다. ✅ 항상 export PATH=$PATH:/opt/jdk/bin 처럼 기존 값 뒤에 덧붙입니다.
export PATH=/opt/jdk/bin # 사고: 기존 PATH 를 통째로 날림
ls # bash: ls: command not found
export PATH=$PATH:/opt/jdk/bin # 올바른 방법: 뒤에 덧붙이기같은 세션에서 이미 PATH 를 날렸다면 export PATH=/usr/bin:/usr/local/bin:$PATH 처럼 표준 경로를 손으로 되살리거나, 재접속해서 처음부터 다시 시작합니다.
.bashrc 에 export 를 넣고 재로그인을 안 한다설정 파일을 고쳐 놓고 같은 셸에서 계속 작업하면 변경 전 값이 그대로 남아 있습니다. JAVA_HOME 을 고쳐도 이미 열어 둔 세션에는 반영되지 않습니다. ✅ source ~/.bashrc 로 즉시 적용하거나, 새 세션으로 재접속해 확인합니다.