J. Aarts
J. Aarts

Reputation: 156

expect exiting after expect{send} statement

when I run this script that I wrote to help installing AUR packages:

enter #!/bin/bash
#bash
function GO() {
    pack="$1"
    cower -ddf $pack
    cd "/home/$USER/applications/$pack"
    expect -c " set timeout -1
        eval spawn makepkg -Ascfi --noconfirm
        expect -nocase \"password for $USER:\" {send \"$pass\r\"}
        interact;"
    cd "../"

}
package="$1"
echo "I need your password for this, can I have it please?"
read -s pass
cd "/home/$USER/applications"

if [ "$package" == "update" ]
then
    file="/home/$USER/applications/update.pkgs"
    cower -u > file 
    while IFS= read -r line
    do
        package=$(echo $line | cut -d " " -f2)
        GO $package
    done <"$file"
else
    GO $package
fi

echo "have a good day."

exit 0

sometimes interact just stoppes after it enters the password and it just echos "have a good day." and exits. am I doing something wrong? timeout is < 0, I have interact aftet the expect statement, anything I am missing?

Upvotes: 0

Views: 216

Answers (1)

glenn jackman
glenn jackman

Reputation: 246774

The only thing I can see is that the password might have a quote in it. You might want to do this:

env _user="$USER" _pass="$pass" expect <<'END'
    set timeout -1
    spawn makepkg -Ascfi --noconfirm
    expect -nocase "password for $env(_user):" {
        send -- $env(_pass)
        send "\r"
    }
    interact
END

No need to eval spawn here.

Using the quoted heredoc makes the code easier to read too.

Upvotes: 1

Related Questions