Expect 스크립트의 Cat은 문자열 끝에 새 줄을 추가합니다.

Expect 스크립트의 Cat은 문자열 끝에 새 줄을 추가합니다.

expect내 스크립트에는 다음이 있습니다

spawn cat version
expect -re 5.*.*
set VERSION $expect_out(0,string)
spawn rpm --addsign dist/foo-$VERSION-1.i686.rpm

명령이 cat버전을 올바르게 가져오고 있지만 새 줄을 추가하는 것 같습니다. 왜냐하면 출력이 다음과 같을 것으로 예상하기 때문입니다.

dist/foo-5.x.x-1.i686.rpm

하지만 처음에는 다음과 같은 오류가 발생합니다.

cannot access file dist/foo-5.x.x
-1.i686.rpm

expect명령 출력에 새 줄이 추가되는 이유는 무엇입니까 cat? 이 작업을 수행하지 않거나 cat 명령의 출력을 수정하는 방법이 있습니까?

답변1

TCL은 다음과 같은 문제 없이 파일을 직접 읽을 수 있습니다 spawn cat.

#!/usr/bin/env expect

# open a (read) filehandle to the "version" file... (will blow up if the file
# is not found)
set fh [open version]
# and this call handily discards the newline for us, and since we only need
# a single line, the first line, we're done.
set VERSION [gets $fh]

# sanity check value read before blindly using it...
if {![regexp {^5\.[0-9]+\.[0-9]+$} $VERSION]} {
    error "version does not match 5.x.y"
}

puts "spawn rpm --addsign dist/foo-$VERSION-1.i686.rpm"

답변2

파일 끝에 줄바꿈이 있을 가능성이 높 version으므로 expect줄바꿈을 추가하는 것보다는 맹목적으로 지시를 따르는 것과 같습니다. IMHO 명령을 생성하기 전에 기대 스크립트를 조정하여 줄 바꿈을 제거하는 것이 더 쉬울 것이며, rpm제거한 후에도 다른 편집자가 종료 줄 바꿈을 다시 넣으면 이 질문이 다시 발생하지 않도록 할 수 있습니다.

파일에 종료 개행 문자가 없더라도 이 경우를 처리하려면 version호출을 추가하는 것이 좋습니다( strip()물론 올바른 구문으로 조정됨).expect

답변3

thrig가 말했듯이 파일을 직접 읽어야 합니다. 또한 catJohn이 말했듯이 를 사용하면 파일 끝에 개행 문자가 생기고 \r\npty를 통과하면 (캐리지 리턴, 개행)이 됩니다 spawn. 따라서 정규식 패턴을 변경하여 다음 문자만 캡처할 수 있습니다.

expect -re "(5.*)\r\n"
set VERSION $expect_out(1,string)

()0(전체 패턴 일치)이 아닌 인덱스 1(캡처)이 어떻게 필요한지 참고하세요 .

tcl또는 다음 명령을 사용하여 공백을 제거할 수 있습니다.

set VERSION [string trim $expect_out(0,string)]

예상되는 줄에서 glob 패턴과 regexp 패턴을 혼동했다는 점에 유의하세요. 5.*.*glob 패턴은5.xx스타일을 입력하세요. 사용한다는 것은 -re정규식만 사용하여 5.*끝까지 모든 것을 일치시켜야 한다는 것을 의미합니다.

관련 정보