(bash) 쉘을 백그라운드에서 실행할 수 있나요?

(bash) 쉘을 백그라운드에서 실행할 수 있나요?

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 }
}

관련 정보