Intellij $'\r': command not found 오류 (LF, CR)

문제점

linux나 mac 또는 windows에서 사용하는 shell script를 intellij에서 실행하려고 하면 아래와 같은 오류가 발생한다.

build.sh: line 2: $'\r': command not found
build.sh: line 4: $'\r': command not found
error: invalid flag: softdrink/module-info.java
Usage: javac <options> <source files>
use --help for a list of possible options
 : no such file or directory
build.sh: line 9: $'\r': command not found

발생 사유

linux/mac에서 사용하는 파일의 format과 windows에서 사용하는 format이 달라서 나는 문제이다.

그 중에서 한 라인의 종료를 어떻게 표시하느냐에 따라서 위와 같은 오류가 발생한다.

  • unix : Line Feed 방식 (LF)으로 라인을 분리한다. \n
  • mac classic : Single Carriage Return 방식 (CR)으로 라인을 분리한다. \r
  • windows : Line Feed와 Single Carriage Return (CR/LF) 을 모두 사용한다. \r\n

윈도우에 맞게 파일 format을 수정해주는 일은 귀찮다.

그래서 Intellij에서는 Change Line separators 기능을 제공해준다.

 

대응 방법

아래 이미지를 보면 CR방식의 파일을 CRLF방식으로 보고 script를 실행시키자 오류가 나는 것을 볼 수 있다.

왜 이런 오류가 나는지 확인해 보자.

$ od -c build.sh

 위는 octal dump 명령어인 od 명령어를 사용할 수 있다는 전제이다.

od명령어는 unix나 linux, windows에서 일반적으로 사용 가능하다.

0000000   /   b   i   n   /   r   m       -   r   f       o   u   t   p
0000020   u   t  \r  \n  \r  \n   m   k   d   i   r       -   p       o
0000040   u   t   p   u   t   /   m   l   i   b  \r  \n  \r  \n   m   k
0000060   d   i   r       -   p       o   u   t   p   u   t   /   c   l
0000100   a   s   s   e   s  \r  \n   j   a   v   a   c       -   d
0000120   o   u   t   p   u   t   /   c   l   a   s   s   e   s       `
0000140   f   i   n   d       s   o   f   t   d   r   i   n   k       -
0000160   n   a   m   e       *   .   j   a   v   a   `  \r  \n   j   a
0000200   r       -   c       -   f       o   u   t   p   u   t   /   m
0000220   l   i   b   /   s   o   f   t   d   r   i   n   k   .   j   a
0000240   r       -   C       o   u   t   p   u   t   /   c   l   a   s
0000260   s   e   s       .  \r  \n   /   b   i   n   /   r   m       -
0000300   r   f       o   u   t   p   u   t   /   c   l   a   s   s   e
0000320   s  \r  \n  \r  \n   m   k   d   i   r       -   p       o   u

위와 같이 hex로 글자를 확인해 보면 \r\n이 사용되는 것을 확인할 수 있다.

위의 script 오류를 보면

'\r': command not found

을 인식하지 못하는 것으로 보인다.

해당 파일 script 실행기는 \n은 인식이 가능한 것으로 보임으로 LF로 파일로 변환시켜서 실행 시키면 될 듯하다.

우하단에 Change Line separators 기능을 이용해서 LF로 파일 포멧을 수정해 줍니다.

$ od -c build.sh
0000000   /   b   i   n   /   r   m       -   r   f       o   u   t   p
0000020   u   t  \n  \n   m   k   d   i   r       -   p       o   u   t
0000040   p   u   t   /   m   l   i   b  \n  \n   m   k   d   i   r
0000060   -   p       o   u   t   p   u   t   /   c   l   a   s   s   e
0000100   s  \n   j   a   v   a   c       -   d       o   u   t   p   u
0000120   t   /   c   l   a   s   s   e   s       `   f   i   n   d
0000140   s   o   f   t   d   r   i   n   k       -   n   a   m   e
0000160   *   .   j   a   v   a   `  \n   j   a   r       -   c       -

위에 \r\n 으로 되어있던 라인종료를 '\n'으로 변경한 것을 볼 수 있습니다.

이제 실행해 보면 잘 작동하는 것을 확인할 수 있습니다.

728x90
반응형