template으로 배포할 때는 문제가 없지만, file로 배포할 때 다음과 같은 오류가 발생하는 경우가 있습니다.
/bin/sh^M: bad interpreter: No such file or directory
원인
이 문제는 DOS/Windows와 Unix 계열 시스템의 줄바꿈 문자 차이 때문에 발생합니다. Windows 형식의 줄바꿈은 CRLF이고, Unix 형식의 줄바꿈은 LF입니다. 스크립트 파일의 첫 줄인 shebang에 ^M 문자가 섞이면 Unix 환경에서 인터프리터 경로를 올바르게 해석하지 못해 위와 같은 오류가 납니다.
해결 방법으로는 dos2unix를 사용하거나, vi에서 set ff=unix로 파일 포맷을 변경하는 방법 등이 있습니다.
Chef에서 방어적으로 처리하기
그래서 배포 후 파일 포맷을 Unix 형식으로 맞추도록 아래와 같이 구현했습니다.
bash 'file_format_to_unix' do
code <<-EOH
vi -c "set ff=unix" -c "wq" #{dir}/#{file}
EOH
end
적용 후에는 대상 서버에서 해당 스크립트를 직접 실행해 보거나, cat -v 등으로 파일에 ^M 문자가 남아 있는지 확인하면 됩니다. 같은 오류가 반복된다면 소스 저장소에 올라간 파일 자체가 Windows 형식으로 저장되어 있는지도 함께 확인하는 것이 좋습니다.