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"