간혹 unix 의 vi 사용에 익숙하지 않은 분 중에 쉘을 간단하게 만들고 나서 실행을 시켰더니 실행이 안 된다고 하시는 분이 있습니다.
[cbssvd01@e9812978:/users/e9812978/shl]ls -al
총계 20
-rwxr-xr-x 1 e9812978 cbsdev 189 6월 27일 15:23 bmlog
drwxr-xr-x 4 e9812978 cbsdev 4096 6월 27일 15:23 ..
drwxr-xr-x 2 e9812978 cbsdev 256 6월 27일 15:23 .
[cbssvd01@e9812978:/users/e9812978/shl]
[cbssvd01@e9812978:/users/e9812978/shl]cat bmlog
#!/usr/bin/ksh
bm_test_log_file=${PFM_USR_LOG_DIR}/TPFMADM02_usr_`date +%Y%m%d`.log
echo "tail -f $bm_test_log_file | grep $1 "
tail -f $bm_test_log_file | cut -c 75-300 | grep $1
[cbssvd01@e9812978:/users/e9812978/shl]bmlog
ksh: bmlog: 찾을 수 없습니다.
[cbssvd01@e9812978:/users/e9812978/shl]./bmlog
ksh: ./bmlog: 찾을 수 없습니다.
[cbssvd01@e9812978:/users/e9812978/shl]
이런 경우를 처음 당하면 난감하겠죠. 분명히 파일이 있고 mode 도 실행권한이 있는데 정작 쉘을 실행 시키면 파일이 없다고 메시지가 나오니 말입니다.
이것의 해답은 간단합니다. vi로 열어 보면 보통의 내용과 다른 뭔가를 발견하게 됩니다. 마치 어깨위에 달라붙은 귀신과 같이 라인 끝마다 ^M 이란 것이 붙어 있는 것이 보입니다.
bm_test_log_file=${PFM_USR_LOG_DIR}/TPFMADM02_usr_`date +%Y%m%d`.log^M
echo "tail -f $bm_test_log_file | grep $1 "^M
tail -f $bm_test_log_file | cut -c 75-300 | grep $1^M
^M
결국 /usr/bin/ 디렉토리 밑에 ksh 라는 파일은 있으나 ksh^M 라는 이름의 파일은 없습니다. 그러니 파일이 없다는 말도 과히 틀린 말은 아니죠. vi로 열어서 다음과 같이 ^M 문자를 모두 없애 버릴 수 있습니다.
bm_test_log_file=${PFM_USR_LOG_DIR}/TPFMADM02_usr_`date +%Y%m%d`.log^M
echo "tail -f $bm_test_log_file | grep $1 "^M
tail -f $bm_test_log_file | cut -c 75-300 | grep $1^M
^M
~
:%s/^M//g
여기서 vi의 커맨드에서 ^M 문자는 입력하기 곤란할 수 있는데 Ctrl키를 누른 상태에서 V를 누른 후 다시 M 을 누르면 입력이 가능합니다.
라인의 끝에 ^M 문자가 들어가게된 것은 작성한 text 파일을 ftp 로 전송할 때 binary 모드로 보낼 때 생기게 됩니다. vi가 익숙하지 않다면 ascii 모드로 ftp 파일 전송을 다시 하면 끝에 달라 붙어 있는 ^M 문자가 떨어집니다.
'컴퓨터활용 > 유닉스' 카테고리의 다른 글
전각 문자를 반각 문자로 변환하는 C 프로그램 (0) | 2008.07.14 |
---|---|
대소문자로 변환 쉘 (1) | 2008.07.02 |
C 로 구현한 right trim function (1) | 2008.06.16 |
gcc 이야기 (0) | 2008.05.19 |
truss를 이용한 input/output 내역 모니터링 (0) | 2008.05.13 |