期待される部分が完了したら、bashスクリプトを実行し続ける方法

期待される部分が完了したら、bashスクリプトを実行し続ける方法

予想されるコードを含むbashスクリプトがあります。

#!/bin/bash
set -ex

funct()
{
pass3="some_pass"

    expect -c "
    spawn su - oracle
    expect "Password:"
    send \"$pass3\n\"
    interact
    "
}
funct

var_ulimit=`ulimit -Ha |grep "open files" |awk '{print $4}'`
echo $var_ulimit

スクリプトの実行時に./script.sh正常に動作するだけでなく、正しいユーザーに切り替えました。問題は、シェルで実行するとスクリプトがこの時点で停止することです。 bashスクリプトはシェルを終了したときにのみ続きます。 bashスクリプトの残りの部分を実行し続け、実行中にスクリプトの残りの部分に対してシェルを維持するようにスクリプトの予想される部分を調整できますかsu - oracle

ありがとう

ベストアンサー1

これはほとんどテストされていません。目的は、ユーザー "oracle" で実行したいコマンドを関数の引数として送信し、そのコマンドが期待されるセッションで実行されるようにすることです。

here-docsの一重引用符を使用してoracleとして実行したいコマンドと期待される本文を含めるので、ここで説明した引用符と一致するように注意してください。

#!/bin/bash
set -ex

as_oracle() {
    local pass="the_password"
    local cmds=$(cat -)         # read the oracle commands from stdin

    # quoting in the next line is very important
    expect -f - "$pass" "$cmds" <<'END_EXPECT'
        lassign $argv pass3 commands

        spawn su - oracle
        expect "Password:"
        send -- "$pass3\r"

        # this is the regular expression that matches the end
        # of oracle's prompt: please change it if it's not correct
        set prompt {\$ $}

        expect -re $prompt
        send -- "eval \"$commands\"\r"
        expect -re $prompt
        send -- "exit\r"
        expect eof
END_EXPECT
}


as_oracle <<'END_ORACLE'
    var_ulimit=$(ulimit -Ha | awk '/open files/ {print $4}')
    echo $var_ulimit
END_ORACLE

evalこれがこれらのコマンドがどのように実行されるのかわかりません。これがより良いかもしれません:

send -- ". <(echo \"$commands\")\r"

おすすめ記事