nano를 사용하여 저장하면 쉘 스크립트가 작동하지만 Notepad++를 사용하여 저장하면 작동하지 않습니다.

nano를 사용하여 저장하면 쉘 스크립트가 작동하지만 Notepad++를 사용하여 저장하면 작동하지 않습니다.

Notepad++의 bash 스크립트를 SSH 내 Nano 편집기의 새 파일에 복사하고 저장하면 됩니다. 잘 작동합니다. (sh ./install).

하지만 파일(정확히 동일한 내용)을 저장하면 내 웹 서버에 업로드한 다음 동일한 컴퓨터에서 Wget을 사용하여 다운로드합니다. 구문 오류가 발생합니다. 인코딩을 확인해 보니 동일한 것 같습니다. 그 이후로 나는 문제가 해결되는지 확인하기 위해 여러 가지 문자 인코딩을 가지고 놀았습니다. wget을 사용하여 파일을 다운로드한 후 파일을 실행 가능하게 만들었습니다!

파일이 잘 실행되고 nano를 사용하여 복사하고 붙여넣을 때 오류가 발생하지 않습니다. 이게 뭔지 아세요?

답변1

나는 문제가 줄 끝과 관련이 있다고 확신합니다. 아마도 어딘가에서 *nix가 아닌 머신을 사용하고 있을 것입니다. 또한 업로드된 텍스트 파일에 Windows 스타일 줄 끝을 추가하는 문제(Linux에서 실행)가 발생하여 apache비슷한 내용을 볼 수 있습니다.

테스트하려면 다운로드한 파일을 가져와서 에 전달하세요 od. 파일이 길면 처음 몇 줄만 가져오세요.

head script.sh | od -c

출력을 보고 다음과 유사한 것이 있는지 확인하십시오.

f   o   o  \r  \n

이는 캐리지 리턴이며 Windows 줄에서는 *nix 와 다르게 끝납니다 \r. 이것이 실제로 문제인 것으로 밝혀지면 캐리지 리턴을 제거하여 파일을 수정할 수 있습니다.\r\n\n

sed -i 's/\r//g' script.sh

답변2

@graeme이 기민하게 지적했듯이 서버에 두 가지 형태의 스크립트가 있으므로 diff작업 버전과 문제가 있는 버전 간의 차이점을 확인하기 위해 간단한 작업을 수행할 수 있습니다.

$ diff working.sh broken.sh

다음과 같이 나란히 비교할 수도 있습니다.

$ diff -y working.sh broken.sh

일종의 오타로 인해 스크립트가 작동하지 않는 경우 일반적으로 -x스위치를 추가하여 이러한 오류를 감지 할 수 있으며 bash, 이로 인해 스크립트가 장황해집니다.

$ bash -x broken.sh

#!/bin/bash다음과 같이 스크립트 상단의 shebang( )에 이 스위치를 통합할 수도 있습니다.

#!/bin/bash -x

줄 끝

이는 Windows에서 Unix/Linux 시스템으로 파일을 이동할 때 종종 문제가 됩니다. 문제는 두 플랫폼 모두에서 줄 끝이 표시되는 방식과 관련이 있습니다. 이에 대한 자세한 내용은 Wikipedia의 제목 아래에서 읽을 수 있습니다.개행 문자.

샘플 파일 만들기

$ echo -e "This is a file.\nThat I made on Unix.\n" > unixfile.txt

@terdon이 그의 답변에서 설명했듯이 이것을 사용하여 sed이를 제거할 수 있으며 종종 dos2unix. 다음 두 가지 방법 중 하나로 사용할 수 있습니다.

$ dos2unix unixfile.txt

또는 기존 파일을 덮어쓰지 않으려는 경우:

$ dos2unix -n oldfile.txt newfile.txt

앞서 언급한 위의 내용을 사용하면 diff두 파일을 비교하면 다음과 같은 출력이 표시됩니다.

$ diff -y unixfile.txt winfile.txt 
This is a couple                            |   This is a couple
of lines of sample                          |   of lines of sample
text.                                       |   text.

그것들이 거기 있다는 것 외에는 차이점을 알 수 없을 것입니다. @terdon의 답변은 문제 해결 접근 방식을 다시 보여줍니다 od. 물론 무슨 일이 일어나고 있는지 파악하는 데 사용할 수 있는 방법은 여러 가지가 있습니다.

vim을 사용하세요

cmd 로 file.

$ file unixfile.txt
winfile.txt: ASCII text 

$ file winfile.txt 
unixfile.txt: ASCII text, with CRLF line terminators

위에서 강조된 문제는 Windows의 파일에 CRLF(일명: 줄 끝의 캐리지 리턴 + 개행 문자)가 있다는 것입니다. 이 문자는 16진수 0x0D 및 0x0A입니다. 다시 참조하세요.줄 바꿈에 관한 Wikipedia 기사더 알고 싶다면.

vim다음을 사용하여 문제를 볼 수도 있습니다 .

$ vim winfile.txt

vim다음은 문제를 보는 방법을 보여주는 작은 순서입니다 . CRLF 문자는 일반적으로 Unix에서 + ^M로 표시됩니다 .CtrlM

                                       vim SS

시퀀스에서는 파일을 winfile.txt형식화된 Unix 파일( :e ++ff=unix)로 다시 여는 모습을 보여줍니다. 이는 vim파일이 Windows에 적합한 형식인지 자동으로 감지하지 않도록 지시하므로 ^M줄 종료 문자가 표시됩니다.

관련 정보