쉘 스크립트는 nano로 저장하면 작동하지만 Notepad++로 저장하면 작동하지 않습니다.

쉘 스크립트는 nano로 저장하면 작동하지만 Notepad++로 저장하면 작동하지 않습니다.

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

하지만 파일(완전히 동일한 내용)을 저장하고 웹 서버에 업로드하고 동일한 시스템에서 Wget을 사용하여 다운로드하면 됩니다. 구문 오류가 발생합니다. 인코딩을 확인해 보니 동일한 것 같습니다. 그 이후로 문제가 해결되는지 확인하기 위해 다양한 문자 인코딩을 사용했습니다. 또한 wget을 사용하여 파일을 다운로드하면 파일을 실행 가능하도록 설정합니다!

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

답변1

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

테스트하려면 다운로드한 파일을 가져와서 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입니다.Newlines에 관한 Wikipedia 기사그것에 대해 더 알고 싶다면.

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

$ vim winfile.txt

vim다음은 문제를 확인하기 위해 수행해야 할 작업을 보여주는 간단한 순서입니다 . CRLF 문자는 일반적으로 Unix에서 ^M, 즉 Ctrl+ 로 표시됩니다 M.

                                       vim의 ss

winfile.txt시퀀스는 파일을 형식화된 Unix 파일( )로 다시 여는 것을 보여줍니다 :e ++ff=unix. 이는 vim파일이 Windows용으로 포맷되었음을 자동 감지하지 않도록 지시하므로 ^M줄 종료 문자가 표시됩니다.

관련 정보