“line 1 : $ ': \ r': command not found”가 표시되는 이유는 무엇입니까?


13

랩톱 (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  

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

답변:


29

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 + 파일 형식 = 유닉스

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


"iter = 1"은 모델이 나중에 5 번 라인을 넘어서 반복해야하는 수학 알고리즘 라운드 수에 사용될 카운터입니다. 에러 메시지. 모든 의견과 지시는 대단히 감사합니다!
TPham

방금 제안 된 명령 "$ tr -d ....."을 시도했지만 랩톱에 문제가 있습니다. "$"로 돌아 가지 않지만 대신 ">"가 화면에 나타납니다. 나가기 위해서는 contrl C를 사용해야합니다. 그런 다음 스크립트를 테스트하여 문제가 해결되었는지 확인했지만 여전히 문제가 없습니다. 죄송합니다,이 분야에 대한 나의 지식은 매우 작습니다! 스크립트 작업을 많이 도와 주므로 스크립트 모음을 활용하려고합니다. 인내심을 갖고 도와 주셔서 감사합니다.
TPham

@TPham, 편집 참조 그래도 문제가 해결되지 않으면 "수락"옆의 확인 표시를 사용하십시오. (해답을 가장 잘 해결 한 답변을 수락하십시오.) unix.stackexchange.com/help/someone-answers
Wildcard

1
단어 인 명령은 거의 전적으로 문장 부호 인 신비한 주문보다 초보자에게 더 복잡하지 않습니다. 별도의 답변이 필요하지 않습니다. vim두 가지 방법 으로이 작업을 수행 할 수 있다는 언급은이 답변 만 필요합니다 . 하나는 단어를 사용합니다. 또는 이 하위 작업이 초보자를위한 unix.stackexchange.com/questions/88811을 포함 하여이 페이지의 어떤 답변 보다 훨씬 상세하게 여기 에서 반복적으로 응답되는 위치 를 지적하는 것이 좋습니다 .
JdeBP

1
그 주 vi -b, \r정력 확장 어쨌든입니다. POSIX가 아니라 nvi, elvis, Solaris vi가 아닙니다.
Stéphane Chazelas

10

이는 스크립트가 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

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


3
메모장 ++에는 실제로 Windows / Mac / Linux 줄 바꿈을 사용하는 옵션이 있습니다. 편집 메뉴로 이동 한 다음 EOL 변환-> 유닉스 (LF)로 이동하면됩니다. 또는 오른쪽 하단에서 더블 클릭하여 다음 Windows (CR LF)과 같이 변경할 수 있습니다.Unix (LF)
jesse_b

당신의 지시에 감사합니다. "iter = 1"은 나중에 5 번 라인을 넘어서 주요 목표를 위해 사용하는 카운터입니다.
TPham

@TPham 천만에요. 방금 지루했고 코드를 가져 와서 내 마음이 인상적이었습니다.
Kusalananda

또는 rm -f [1-9].txt 10.txt. 그러나 그것은 아니다 완전히 어떤 파일이없는 것처럼, 논리적으로 동등한 1-9하지만 거기에 있다 그대로라는 파일 [1-9].txt뒤 삭제 될 것이다. : D
와일드 카드

5

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

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

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


도움을 주신 여러분 모두에게 감사합니다. 방금 dos2unix를 시도했지만 가지고 있지 않은 것 같습니다. 검색하고 다시 시도하십시오.
TPham

3

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

첫째, 일반 텍스트 파일의 경우 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은 이러한 불편 함을 제외하고는 멋진 패키지입니다.


당신의 지시 B 레이어에 대단히 감사합니다! 이 스택 교환 그룹은 매우 유용합니다. 이 지원에 정말 감사합니다.
TPham

1

dos2unix가 아니면 'flip'도 있습니다

$ flip -u yourfilename.txt

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


1

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

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

여기에 이미지 설명을 입력하십시오

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.