expect
일단 시작되면 터미널을 모니터링하고 일치하는 항목이 발견될 때마다 명령을 실행하는 스크립트를 작성하려고 합니다 .
이것이 가능합니까 expect
? 그렇다면 expect_background
사용하는 것이 옳은 것일까요?
편집: 확실히 말하자면 expect
입력이 아닌 터미널에서 출력을 시도하고 있습니다.
답변1
예, bash를 사용하면 간단하게 이를 수행할 수 있습니다. 표준 출력을 tee
패턴을 볼 때 작업을 수행할 수 있는 프로세스로 리디렉션합니다. tee
표준 출력에 표준 출력을 추가하기 때문에 좋습니다.
exec 1> >(tee >(awk '/foobar/ {print "*** DING DING ***"}'))
tee
이는 표준 입력을 stdout 및 프로세스 대체 2(뭔가를 수행하는 awk 스크립트)에 복사하는 프로세스 대체 1로 stdout을 보냅니다 . 코드나 스크립트의 경로를 내부 프로세스 대체에 넣을 수 있습니다.
전시하다
$ echo this is foobar stuff
this is foobar stuff
$ exec 1> >(tee >(awk '/foobar/ {print "*** DING DING ***"}'))
$ date
Thu Mar 10 16:37:14 EST 2016
$ pwd
/home/jackman
$ echo this is foobar stuff
this is foobar stuff
*** DING DING ***
답변2
#!/usr/bin/env expect
#
# Adapted from autoexpect(1). Matches stuff from user.
if {[llength $argv] == 0} {
send_user "Usage: $argv0 command \[cmd args...]\n"
exit 64
}
match_max 100000
set userbuf ""
proc input {c} {
global userbuf
send -- $c
append userbuf $c
# if see this pattern in the input, execute command
# NOTE may well muss up the terminal display, depending
# on the output, etc.
if {[regexp "echo.foo\r" $userbuf]} {
system "uptime"
# trim buffer between commands so not chewing up all the memory
} elseif {[regexp "\r" $userbuf]} {
set userbuf ""
}
}
spawn -noecho $argv
interact {
# match incoming characters, send to buffer builder (otherwise
# if just "echo foo" here that input will vanish until expect
# can run a command, or fails the match, which isn't nice.
-re . { input $interact_out(0,string) }
eof { return }
}
다른 방법은 더 간단합니다(그러나 쉘 에코에 주의하세요).
#!/usr/bin/env expect
#
# Also adapted from autoexpect(1).
if {[llength $argv] == 0} {
send_user "Usage: $argv0 command \[cmd args...]\n"
exit 64
}
match_max 100000
proc output {s} {
send_user -raw -- $s
# NOTE shells tend to echo commands as they are typed, which may
# cause double-triggers depending on the expression being looked
# for an what exactly is passed to this call from the echos.
if {[regexp "foo" $s]} {
system "uptime"
}
}
spawn -noecho $argv
interact {
-o -re .+ { output $interact_out(0,string) }
eof { return }
}