Windows(CRLF)에서 작성한 파일을 Unix/Linux(LF) 계열 서버로 업로드하면, 라인 끝에
^M특수문자가 붙어 스크립트 실행 에러(bad interpreter)를 유발합니다. AIX 환경에서도 확실하게 동작하는 Perl 명령어를 이용한 일괄 제거 방법을 정리합니다.
0. 원인 및 증상 (Context)
운영체제마다 줄바꿈(New Line)을 처리하는 방식이 다릅니다.
- Windows: CR(Carriage Return, \r) + LF(Line Feed, \n)
- Unix/Linux/AIX: LF(\n)
FTP 전송 시 ASCII 모드가 아닌 Binary 모드로 전송하거나, 단순 복사/붙여넣기를 할 경우 Windows의 CR(\r) 문자가 그대로 남아 vi 에디터에서 ^M으로 표시됩니다.
Test Environment
- OS: AIX (또는 Linux)
- Shell: sh, ksh, bash
1. 문제 확인 (Issue Identification)
쉘 스크립트 실행 시 에러가 발생하거나, vi로 파일을 열었을 때 라인 끝마다 ^M이 붙어있는 것을 확인할 수 있습니다.
vi 에디터 화면
#!/bin/sh^M
#./startServer.sh server_name^M
#./stopServer.sh server_name -username username -password password^M
2. 해결 방법 A: Perl 명령어 사용 (권장)
AIX의 기본 sed 명령어는 -i(파일 직접 수정) 옵션을 지원하지 않는 경우가 많습니다. 따라서 Perl을 사용하는 것이 가장 호환성이 좋고 간편합니다.
명령어 구문
^M을 직접 입력하기 번거로우므로, 8진수 코드인 \015를 사용하는 것이 안전합니다.
# 구문: perl -pi -e 's/찾을문자/바꿀문자/g' [파일명]
perl -pi -e 's/\015//g' stopWasAll.sh
다중 파일 일괄 처리
와일드카드(*)를 사용하여 여러 파일을 한 번에 변환할 수 있습니다.
# 현재 경로의 모든 .sh 파일에서 CR 제거
perl -pi -e 's/\015//g' *.sh
3. 해결 방법 B: vi 에디터 내부 치환
파일을 열어놓은 상태에서 수정하고 싶을 때 사용합니다.
vi로 파일 열기- 명령 모드(ESC)에서 치환 명령어 입력
:%s/^M//g
Tip: 위 명령어의
반드시
^M은 Shift + 6, M을 타이핑하는 것이 아닙니다.반드시
Ctrl + V를 누른 상태에서 Ctrl + M을 눌러야 입력됩니다.
4. 해결 방법 C: dos2unix 유틸리티
리눅스(CentOS/Ubuntu) 환경이라면 전용 도구를 설치하여 해결하는 것이 가장 쉽습니다.
# 설치 (CentOS)
yum install -y dos2unix
# 변환
dos2unix stopWasAll.sh
5. 검증 (Verification)
변환 후 다시 vi로 파일을 열어 ^M 문자가 사라졌는지 확인합니다.
test1 root [/was8/bin]# vi stopWasAll.sh
#!/bin/sh
#./startServer.sh server_name
#./stopServer.sh server_name -username username -password password
#PropFilePasswordEncoder.sh
#export LANG=en_us.utf8
깔끔하게 정리된 것을 확인할 수 있습니다.