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