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