“line 1 : $ ‘: \ r’: command not found”가 표시되는 이유는 무엇입니까? 작동하지 않습니다.

랩톱 (DOS)에서 Cygwin을 사용했습니다. 나는 동료와 내 자신의 스크립트 모음을 가지고 있습니다. 저는 유닉스 지식이없는 IT 담당자가 아닙니다. 나는 동료의 구문을 따르고 몇 가지 간단한 것을 관리 할 수 ​​있습니다.

스크립트는 오래된 랩톱에서 잘 작동했습니다. 방금 노트북을 바꾸고 Cygwin을 설치했습니다. 스크립트를 실행할 때 작동하지 않습니다. 다음은 내가받는 오류 메시지의 예입니다.

line 1: $':\r': command not found
line 5: syntax error near unexpected token `$'\r''
line 5: `fi

내 스크립트의 상위 5 줄입니다

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

누군가이 문제를 해결할 수있는 방법을 설명해 주시겠습니까?



답변

Windows 스타일 줄 끝이 있습니다.

no-op 명령 :은 대신로 읽혀 지거나로 완전히 :<carriage return>표시됩니다 .:\r$':\r'

실행 dos2unix scriptname하고 당신은 괜찮을 것입니다.


이 없으면 거의 모든 곳에서 dos2unix작동해야합니다 (Windows의 MobaXterm에서 테스트했습니다).

vi -b filename

그런 다음에 다음을 vi입력하십시오.

:%s/\r$//
:x

잘가요


에서 vim당신이 Cygwin에서에 사용하는 것입니다, vi이 일을 여러 가지 방법이 있습니다. 또 다른 하나는 관련된 fileformat값을 취할 수 설정, dos또는 unix. 파일을로드 한 후 명시 적으로 변경하십시오.

파일 형식 설정 = 유닉스

또는 파일을 쓸 때 파일 형식을 명시 적으로 강제

: w + 파일 형식 = 유닉스

이에 대한 자세한 내용은 다음을 포함하여이 주제를 다루는 많은 질문과 답변을 참조하십시오.


답변

이는 스크립트가 DOS 줄 끝을 사용하는 편집기 (예 : 메모장 ++)로 저장했기 때문입니다. 스크립트에서이를 제거해야합니다.

이렇게하려면 dos2unix스크립트 파일을 사용하거나

$ tr -d '\r' <script >script.new && mv script.new script

(이것은 스크립트의 어느 곳에서나 모든 캐리지 리턴을 제거합니다 )


스크립트의 코드는 다음과 같습니다.

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt
fi  

이것은 아마도 다음과 같이 보일 것입니다

iter=1
if [ -f "./$iter.txt" ]; then
   rm "./$iter.txt"
fi

1.txt존재하는 경우 현재 디렉토리에서 파일 을 제거 합니다. 이 :명령은 (거의) 아무것도하지 않으며 제거 될 수 있습니다. iter변수의 값으로 사용되어야 $iter하고, 인용 될 수있다. 그리고 ./파일을 현재 디렉토리에서 찾을 필요가 있다고 말하는 데 필요한 것보다 더 명확합니다 .

당신은 루프에이를 설정하는 계획하는 경우 (모든 파일을 삭제, 여기 1.txt, 2.txt, …, 10.txt) :

iter=1
while [ "$iter" -le 10 ]; then
    if [ -f "./$iter.txt" ]; then
        rm "./$iter.txt"
    fi
    iter=$(( iter + 1 ))
done

또는 비열하고 게으른 느낌이 들면

rm -f {1..10}.txt

중괄호 확장을 이해하는 쉘에서.


답변

스크립트의 줄 끝이 잘못되었습니다. Windows는 CR + LF (\ r \ n), Unix는 LF (\ n), Classic MacOS는 CR (\ r)을 사용합니다. 텍스트 편집기 나 같은 독립형 도구를 사용하여 영향을받는 모든 파일의 줄 끝을 변경해야합니다 dos2unix.

SVN과 같은 FTP 및 버전 제어 시스템은 줄 끝을 적절하게 변환 할 수있는 경향이 있으므로 나중에 파일을 전송하기위한 옵션을 살펴볼 수 있습니다.

이러한 파일 전송 되지 않고 단일 컴퓨터에서 사용 된 경우 원하는 텍스트 편집기에서 줄 끝 설정을 찾고 싶을 것입니다. “프로그래머 용”으로 광고되는 대부분의 경우 이러한 옵션이 있습니다.


답변

보충 답변으로 몇 가지 메모 / 팁을 추가하겠습니다 …

첫째, 일반 텍스트 파일의 경우 file명령을 사용하여 Unix 또는 DOS 줄 끝이 있는지 쉽게 확인할 수 있습니다 . 예를 들면 다음과 같습니다.

$ file test.txt
test.txt: ASCII text, with CRLF line terminators
$ dos2unix test.txt
dos2unix: converting file test.txt to Unix format...
$ file test.txt
test.txt: ASCII text

내 사용에 유의하십시오 dos2unix. 설치하는 것이 좋습니다. Cygwin을 사용하는 방법에 따라 편의를 환영 할 정도로 자주이 변환을 수행해야 할 수도 있습니다. 더 중요한 것은 여기에서 논의한 수동 편집으로 얻을 수있는 것과 같은 오류가 없다는 것입니다.

설치하려면 기본 Cygwin 실행 파일을 시작하십시오. setup-x86_64.exe와 같은 이름이거나 그 라인을 따라있는 이름입니다. 다음과 같은 화면이 표시되는지 확인하십시오.

기본 설치를 이미 완료 했으므로 선택 화면이 표시 될 때까지 다음 을 클릭 할 수 있습니다. 드롭 다운에서 전체를 선택하고 검색 상자에 “dos2″를 입력하고 다음과 같이 도구를 선택하십시오.

그런 다음 다음을 다시 클릭 하고 설치를 완료하십시오. 그게 다야. 즐기세요 Cygwin은 이러한 불편 함을 제외하고는 멋진 패키지입니다.


답변

dos2unix가 아니면 ‘flip’도 있습니다

$ flip -u yourfilename.txt

유닉스 줄 끝을 사용하여 뒤집습니다.


답변

WinSCP로 서버에 연결하여 Notepad ++ 를 사용 하여 bash (.sh) 스크립트를 편집
합니다 (WinSCP 편집기를 Notepad ++로 설정하려면 https://winscp.net/eng/docs/ui_editor_preferences )

이는 ” Vim “편집기 대신 서버에서 파일을 열어 편집 / 저장하는 데 매우 유용 합니다. Notepad ++
에서 파일을 열 때 하단의 상태 표시 줄에서 7 번째 열을 두 번 클릭하고 ” Unix (LF) “를 선택하십시오 .

또한 상단 표시 줄에서 인코딩-> UTF-8로 인코딩하여 8 번째를 변경해야합니다.


답변

Cygwin ‘s Bash가 Mac 및 Windows EOL (End-of-Line) 인코딩과 함께 작동하도록 실제 파일의 라인 인코딩을 변경할 필요는 없습니다. 뒤집기 만하면되는 옵션이 있습니다.

그냥 ~/.bash_profile포함하도록 업데이트하십시오.

export SHELLOPTS
set -o igncr

https://ptolemy.berkeley.edu/projects/chess/softdevel/faq/5.html을 참조 하십시오