예상 스크립트를 "가져오는" 방법은 무엇입니까?

예상 스크립트를 "가져오는" 방법은 무엇입니까?

다음과 같은 스크립트를 사용해야 합니다.

# test.sh
function my_fun
{
    echo "Give value for FOO"
    local my_var
    read my_var
    export FOO=$my_var
}

# Call my_fun function
my_fun

내 껍질에서 가져오세요.

$ source test.sh
Give value for FOO
stackexchange
$ echo $FOO
stackexchange

Expect를 사용하여 다음과 같은 스크립트를 자동화하고 싶습니다.

$ expect test.exp
$ echo $FOO
stackexchange

환경 변수의 수와 이름을 test.sh알 수 없습니다.

고쳐 쓰다:

  • test.sh에 모든 my_fun 함수를 추가합니다.

답변1

근본적인 문제는 자식 프로세스가 부모 프로세스의 환경을 변경할 수 없다는 것입니다. 이것이 바로 source환경 변수가 현재 셸에 유지되도록 셸 스크립트가 필요한 이유입니다.

spawnExpect는 하위 프로세스 와 함께 사용하도록 설계되었습니다 . 현재 쉘할 수 없다결과에 영향을 받습니다 expect test.exp.

그러나 쉘을 생성하고 해당 쉘 스크립트를 얻은 다음 유지할 수 있습니다.저것셸과 상호 작용합니다. 테스트되지 않은 내 생각은 다음과 같습니다.

#!/usr/bin/expect -f
set timeout -1
spawn $env(SHELL)
set myprompt "some pattern that matches your prompt"
expect -re $myprompt
send "source test.sh\r"
expect {
    "Give value for " {
        # provide the same answer for every question:
        send "some value\r"
        exp_continue
    }
    -re $myprompt
}
interact

이제 생성된 쉘과 상호작용하고 있습니다. 이 쉘을 사용하면 exit결과 쉘이 종료되고 스크립트가 종료될 것으로 예상되며 초기화된 변수 없이 현재 쉘로 돌아갑니다.

답변2

함수를 실행하기 전과 후에 환경을 구별하기 위해 셸 스크립트를 만들 수 있습니다.

#!/bin/bash
# run.sh
source ./test.sh
ENV_BEFORE=$(set | grep -v "^_")
my_fun
ENV_AFTER=$(set | grep -v "^ENV_BEFORE" | grep -v "^_")
# echo the new environment variables
echo "$ENV_AFTER" | grep -v -F -x -f <(echo "$ENV_BEFORE")

그런 다음 예상을 사용하여 스크립트를 실행합니다.

# test.exp
log_user 0
spawn ./run.sh
expect "Give value for "
expect -re  "(.*)\r\n"
send -- "stackexchange\r\n"
expect -re  "(.*)\r\n"
expect -re  "(.*)\r\n"
puts $expect_out(1,string)

출력 소스:

$ source <(expect test.exp)
$ echo $FOO
stackexchange

답변3

spawn /bin/bash -c ". ./source_script.sh && ./exec_script.sh"

관련 정보