^M 개행문자로 인한 Shell Script 오류

개요

Windows 환경에서 작성하거나 FTP(Binary 모드)로 전송한 Shell Script를 Linux에서 실행할 때 ^M 개행문자 오류(bad interpreter)가 발생하는 경우가 있습니다. Windows의 줄바꿈 문자는 CRLF(\r\n), Linux는 LF(\n)이며, 변환 없이 전송하면 각 줄 끝에 \r(^M)이 남아 인터프리터 경로가 깨집니다. vim 치환 기능이나 sed 명령으로 간단하게 해결할 수 있습니다.

증상 — Shell Script bad interpreter error

Shell Script를 Linux 환경에서 실행하면 아래와 같이 /bin/bash^M: bad interpreter 에러가 발생합니다.

[root@localhost ~]# ./temp.sh
-bash: ./temp.sh: /bin/bash^M: bad interpreter: No such file or directory

원인 — CRLF vs LF 개행문자 차이

결론적으로 Windows와 Linux의 개행문자 차이로 인해 발생합니다. Binary 타입으로 Windows 에디터에서 저장하거나 FTP로 전송하면 Windows 개행문자 ”
“이 Linux의 ”
“으로 변환되지 않아 각 줄 끝에
(^M)이 남습니다.

LF : Line Feed 커서를 한칸 아래로 이동 = 새로운 행 추가(new line feed)
CR : Carriage Return 커서를 맨왼쪽으로 이동 = 시작위치로 복귀(return)

vim -b(Binary 모드)로 파일을 열면 줄 끝의 ^M 문자를 직접 확인할 수 있습니다.

[root@localhost ~]# vim -b temp.sh

!/bin/bash^M
^M
ls -lh^M

해결 방법

단순히 ^M만 삭제해도 해결되지만 수백 줄 이상의 스크립트에서는 vim 치환 기능이나 sed 명령을 사용합니다. 개행문자 ^M은 “Shift+6”, “Shift+m”이 아닌 “Ctrl+v+m”으로 입력해야 합니다.

방법 1: vim -b 모드에서 :%s 치환 사용

[root@localhost ~]# vim -b temp.sh

:%s/^M//g

방법 2: vim Last Line Mode에서 fileformat 설정 후 저장

[root@localhost ~]# vim temp.sh

:set fileformat=unix
:wq

방법 3: sed 명령 사용 (vim을 사용하기 어려운 환경)

[root@localhost ~]# sed -i -e 's/
$//' temp.sh

# 또는 (^M은 Ctrl+v+m 입력)
[root@localhost ~]# sed -i -e 's/^M$//' temp.sh

dos2unix 유틸리티 사용

vim이나 sed 대신 dos2unix 유틸리티를 사용하면 CRLF → LF 변환을 가장 간단하게 처리할 수 있습니다. 대부분의 리눅스 배포판에서 패키지로 제공되며, 여러 파일을 한 번에 처리하거나 디렉토리 전체를 변환하는 데 유리합니다.

# 설치 (RHEL/CentOS)
yum install dos2unix -y

# 단일 파일 변환 (CRLF → LF)
dos2unix temp.sh

# 여러 파일 일괄 변환
dos2unix *.sh

# 변환 전 파일 타입 확인
file temp.sh
# "ASCII text, with CRLF line terminators" — 변환 필요
# "ASCII text" — 이미 LF, 변환 불필요

반대로 Linux 파일을 Windows 형식(LF → CRLF)으로 변환할 때는 unix2dos 명령을 사용합니다. Git을 사용하는 환경이라면 .gitattributes 파일에 * text=auto를 설정하여 체크아웃 시 자동으로 개행문자를 변환할 수 있습니다.

사전 예방

저장하거나 전송할 때 미리 파일 포맷(Unix LF)을 선택하면 이 문제를 예방할 수 있습니다. Notepad++나 VS Code 같은 Windows 에디터에서 줄바꿈 형식을 LF로 설정하거나, FTP 클라이언트에서 ASCII 모드로 전송하면 자동 변환됩니다.

참고

참고 문서: sed(1) Linux man page · Vim 검색·치환 명령어 문서

Physical Layer Summary

개요

네트워크 인프라 설계 시 데이터센터 간 연결이나 ISP와의 회선 구성에서 전용선(Leased Line) 대역폭 규격과 광케이블 모듈 선택은 중요한 요소입니다. 북미식 T-carrier(T1~T4)와 유럽식 E-carrier(E1~E5) 계층 구조를 이해하면 회선 계약 시 스펙을 정확히 해석하고 비교할 수 있습니다. 또한 광케이블 GBIC 모듈 선택 시 SX/LX/LH/ZX의 전송 거리와 광섬유 타입 조합을 파악해야 올바른 스펙으로 장비를 구성할 수 있습니다.

전용선 대역폭(Leased Line Bandwidth)

전용선 대역폭은 T-carrier(북미식)와 E-carrier(유럽식) 두 체계로 나뉩니다. T1은 24채널의 DS0(64Kbps)를 묶은 1.544Mbps 회선으로, 미국에서 기업용 인터넷/음성 회선의 기본 단위였습니다. T3(DS3)는 T1의 28배인 44.736Mbps로 대용량 인터넷 백본에 사용되었습니다. 유럽식 E1은 32채널의 2.048Mbps로, 한국을 포함한 아시아/유럽에서 표준으로 사용됩니다. 현재는 이 전통적인 계층 대신 이더넷 기반의 1GbE/10GbE 전용선이 주류이나, 레거시 시스템 분석 및 통신 장비 스펙 이해에 이 규격 지식이 필요합니다.

  • 북미식
T1 : 1,544 Mbps (1.5Gbps)
T2 : 6.312 Mbps (6Gbps) (T1 *4)
T3 : 44,736 Mbps (44Gbps) (T2 *7)
T4 : 274,176 Mbps (274Gbps) (T3 *6)
  • 유럽식
E1 : 2,048 Mbps (2Gbps)
E2 : 8,448 Mbps (8Gbps) (E1 *4)
E3 : 34,368 Mbps (34Gbps) (E2 *4)
E4 : 139,264 Mbps (139Gbps) (E3 *4)
E5 : 565,148 Mbps (565Gbps) (E4 *4)

출처> T1/T2/T3/T4/E1이란 무엇인가? : 네이버 블로그 (naver.com)

Fibre GBIC 모듈과 이더넷 케이블

광 트랜시버(GBIC, SFP) 모듈 선택 시 가장 중요한 것은 전송 거리광섬유 타입입니다. SX(short-wave)는 멀티모드 광섬유를 사용하며 짧은 거리(최대 550m)에 적합합니다. LX/LH(long-wave)는 싱글모드 광섬유로 최대 10km, ZX(extended-range)는 최대 70~100km 장거리 전송에 사용됩니다. 멀티모드는 코어 지름이 50㎛ 또는 62.5㎛이고, 싱글모드는 9/10㎛입니다. 스위치 간 거리가 100m 이내라면 Cat5e/Cat6 UTP 케이블의 1000BASE-T가 경제적입니다.

  • 네트워크 장비에서 FX Module의 종류
  • SX(shortwave), LX/LH(longwave/long-haul), ZX(extended-range)
  • 스테이션 간 최대 케이블 연결 거리
1000BASE-SX: 62.5 um multi-mode 광섬유: 최대 275m
1000BASE-SX: 50 um multi-mode 광섬유: 최대 550m
1000BASE-LX: 62.5 um multi-mode 광섬유: 최대 550m
1000BASE-LX: 50 um multi-mode 광섬유: 최대 550m
1000BASE-LX: 9/10 um single-mode 광섬유: 최대 5 km
1000BASE-LH: 62.5 um multi-mode 광섬유: 최대 550m
1000BASE-LH: 50 um multi-mode 광섬유: 최대 550m
1000BASE-LH: 9/10 um single-mode 광섬유: 최대 10 km
1000BASE-ZX: 9/10 um single-mode 광섬유: 최대 70 km
1000BASE-ZX: disposition shifted fiber: 최대 100 km
1000BASE-T: Category 5 케이블: 최대 100m 

출처> https://blog.naver.com/thescream/162109870

이더넷 케이블 카테고리 요약

구내 배선(LAN) 환경에서는 UTP 케이블 카테고리가 지원 속도와 최대 거리를 결정합니다. Cat5e(Enhanced Cat5)는 1Gbps/100m를 지원하며 현재 가장 많이 사용되는 기본 규격입니다. Cat6은 10Gbps를 지원하되 55m 이내에서만 안정적입니다. Cat6A(Augmented Cat6)는 10Gbps/100m를 완전히 지원합니다. Cat7/8은 25~40Gbps 이상의 데이터센터 환경을 위한 고사양 케이블입니다. 신규 배선 시에는 Cat6A 이상을 권장하며, 기존 Cat5e 배선에서 10GbE로 업그레이드하려면 케이블 교체가 필요할 수 있습니다.

케이블 선택과 함께 스위치 포트의 Auto-MDIX 지원 여부도 확인해야 합니다. 현대의 스위치는 대부분 Auto-MDIX를 지원하여 다이렉트/크로스 케이블 구분 없이 자동 감지합니다.

참고

참고 문서: T-carrier 위키피디아 · Ethernet over twisted pair 위키피디아

vi editor

개요

vi editor 명령어는 Unix / Linux 시스템 관리자가 반드시 숙지해야 하는 기본 텍스트 편집기 조작법입니다. vi는 모든 Linux/Unix 배포판에 기본 포함되어 있어 GUI가 없는 서버 환경에서도 파일 편집이 가능하며, Command Mode / Insert Mode / Last Line Mode 세 가지 모드로 동작합니다. 각 모드의 전환 방법과 커서 이동, 삭제, 복사, 검색·치환 명령어를 정리합니다.

What is vi?

  • Unix 계열에서 사용되는 text 편집기
  • 최근의 Redhat 계열 Linux에서는 vim을 vi로 alias 처리(vim 패키지 미설치시 미적용)
  • UNIX와 Linux의 Terminal CLI 환경에서는 가장 기본적인 편집기이기 때문에 기본적인 사용키 정도는 익혀두는 것이 좋습니다.

3 modes of vi

  • Command Mode(명령) : esc 입력 상태, 기본값
  • Insert Mode(입력) : 편집 상태
  • Last Line Mode(명령) : Command Mode상 : “shift + ;” 입력 상태, 파일 또는 vi 상태 제어

Commande Mode Control

Input Function
h 왼쪽 이동
j 위로 이동
k 아래로 이동
l 오른쪽 이동
^ or 0 행의 가장 처음으로 이동
$ 행의 가장 끝으로 이동
gg 제일 첫 행으로 이동
G 제일 끝 행으로 이동
b 왼쪽 특수문자 혹은 한단어의 처음으로 이동
B 왼쪽 한단어의 처음으로 이동
x 현재 커서 위치 삭제
X 현재 커서가 위치한 앞 글자 삭제
dw 현재 커서 위치 한단어 삭제
d$ 현재 커서 위치 행 삭제
dd 현재 커서부터 마지막 행까지 삭제
CTRL+b 한페이지 위로 이동
CTRL+f 한 페이지 아래로 이동
숫자+G 해당 숫자의 행으로 이동
w 오른쪽 특수문자 혹은 한단어의 처음으로 이동
W 오른쪽 한단어의 처음으로 이동
i 현재 커서 앞쪽에 입력
I 현재 커서 행의 맨 앞에서 입력
a 현재 커서 뒤쪽에 입력
A 현재 커서 행의 마지막에 입력
o 현재 커서 행의 아래 줄에 입력
O 현재 커서 행의 위쪽 줄에 입력현재 커서 행의 위쪽 줄에 입력
s 현재 커서의 한 글자를 지우고 입력
S 현재 커서의 행을 지우고 입력
r 현재 커서의 한 글자를 교체
cw 현재 커서의 한 단어 교체
u Undo(입력시 마다 이전 작업으로 이동)
숫자+yy 현재 커서부터 숫자만큼의 행을 복사(1은 생략 가능)
yw 현재 커서의 한 단어 복사
Y$ 현재 커서부터 마지막 행까지 복사
숫자+p 복사한 내용을 현재 커서 다음에 붙여넣기(숫자 횟수 만큼)
숫자+P 복사한 내용을 현재 커서 전에 붙여넣기(숫자 횟수 만큼)
/ 커서의 위치에서 아래로 검색
? 커서의 위치에서 위로 검색
n 검색 결과에서 아래 행 이동
N 검색 결과에서 위 행 이동
모든 제어는 커서의 위치 기준

Insert Mode Control

  • i, a등의 Command Mode 제어키를 통해 입력 모드로 전환
  • 문서의 작성 또는 편집이 가능한 상태

Last Line Mode Control

Input Function
:s/찾는문자열/치환문자열 현재 커서 행에서 검색, 치환
:1,10s/찾는문자열/치환문자열 1행에서 10행까지 검색, 치환
:%s/찾는문자열/치환문자열 전체 행에서 검색, 치환
\+/ 특수문자를 검색하려면 해석방지를 위해 그 앞에 \를입력
:nohl 검색등을 통해 하이라이트(Highlight)처리된 블럭을 해제
:set number 행 번호 표시
:set nonumber 행 번호 표시 취소
:set autoindent 들여쓰기 설정
:set noautoindent 들여쓰기 제거
:set list 문단,조판부호 보기
:set nolist 문단,조판부호 안보이게
:set ignorecase 검색시 대소문자 구별 제거
:set noignorecase 검색시 대소문자 구별
:set window=30 한 화면당 행의 갯수 30개로 지정
:set all 현재 설정된 vi 모든 설정값 보기
:q 저장하지 않고 vi 종료
:q! 읽기전용인 파일을 수정후 강제로 저장할때
:w 현재내용을 저장
:w! 읽기전용인 파일을 수정후 강제로 저장할때
:wq 저장하고 종료
:wq! 읽기전용인 파일을 수정후 강제로 저장하고 종료하기
:w “filename” 새로운 파일명으로 저장
모든 제어는 커서의 위치 기준

참고

참고 문서: Vim 공식 사용자 매뉴얼 — 처음 파일 편집하기 · vi(1) POSIX man page