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가 말했듯이 파일을 직접 읽어야 합니다. 또한 cat
John이 말했듯이 를 사용하면 파일 끝에 개행 문자가 생기고 \r\n
pty를 통과하면 (캐리지 리턴, 개행)이 됩니다 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.*
끝까지 모든 것을 일치시켜야 한다는 것을 의미합니다.