como continuar a execução do script bash quando esperar que a parte esteja concluída

1

Eu tenho o script bash e parte dele com o código esperado:

#!/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

quando executo o script ./script.sh , parte com o trabalho exepct ok eu mudei para usuário correto. O problema é que a parada do script é nesse ponto quando executada a partir do shell. Apenas quando eu sair do script bash shell continua. É possível ajustar a expectativa de que parte do script continue com o restante do script bash e preservar o shell para o restante do script quando su - oracle ?

Thnx

    
por klerk 15.05.2015 / 12:32

2 respostas

1

Os dois últimos comandos nunca serão executados no shell do usuário oracle. Tente isso:

expect -c "
  log_user 0
  spawn su - oracle -c \"ulimit -Hn\"
  expect \"Passwort:\"
  send \"$pass3\n\"
  expect eof
  puts \"\$expect_out(buffer)\"
"

Também presumindo que você deseja apenas o limite open files , com o sinalizador -n (não é necessário grep , awk , ...).

    
por 15.05.2015 / 14:09
1

Isso não é testado. O objetivo é enviar os comandos que você deseja executar como usuário "oracle" para a função como um parâmetro e, em seguida, fazer com que eles sejam executados na sessão de espera.

Isso usa aqui aspas simples para conter os dois comandos que você deseja executar como oracle e o corpo esperado, por isso cuide para corresponder às citações que estou demonstrando aqui.

#!/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

Não tenho certeza de que eval é a maneira de executar esses comandos. Isso pode ser melhor:

send -- ". <(echo \"$commands\")\r"
    
por 15.05.2015 / 16:34

Tags