user3087714
user3087714

Reputation: 11

How to use error codes inside bash script

Apologies if this has been asked before, I was unable to find an answer...

I have created a bash script for OS X to mount an AFP share. The script works successfully and allows a user to type their username and password into a graphical popup using cocoa dialog

My issue is that if the username and password are entered incorrectly, I want to be able to display a new pop up window explaining this.

I was trying to do this based on the exit status of the script but the script returns 0 regardless of whether or not the mount was successful

The script is as follows;

cd=/etc/cocoaDialog.app/Contents/MacOS/cocoaDialog

rvUsername=($($cd standard-inputbox --title "Network Mount" --informative-text "Please enter your username"))

username=${rvUsername[1]}

rvPassword=($($cd secure-standard-inputbox --title "Network Mount" --informative-text "Please enter your password"))

password=${rvPassword[1]}

mkdir "/Volumes/Test"

expect <<- DONE
  set timeout -1
  spawn /sbin/mount_afp -i "afp://servername/Software" /Volumes/Test

  expect "*?ser:*"
  send "$username\n"

  expect "*?assword:*"
  send "$password\r"

  expect EOF
DONE

If I run this via Terminal or Textmate, I receive the following (as an example)

spawn /sbin/mount_afp -i afp://server/Software /Volumes/Test
User: username 
Password: 
mount_afp: the volume is already mounted 

Program exited with code #0 after 7.32 seconds.

So mount_afp is giving me a message, which I would then like to use in my script...but the exit code is 0 and I don't know how else to get hold of that message to use

Any ideas? (Hope that makes sense!)

Upvotes: 1

Views: 387

Answers (2)

user3087714
user3087714

Reputation: 11

Thanks for the responses all, helped point me in the right direction

I ended up taking this approach and setting the expect command as a variable

output=$(su -l $loggedInUser -c expect <<- DONE
  set timeout -1
  spawn /sbin/mount_afp -i "afp://$serverName" /Volumes/mount

  expect "*?ser:*"
  send "$username\n"

  expect "*?assword:*"
  send "$password\r"

  expect EOF
DONE)

Upvotes: 0

chaos
chaos

Reputation: 9282

To get the exit code of the spawned command, use something like this:

# wait for the command to end : wait for the prompt $ followed by space
expect "\\$ "
send "echo \$?\r"
expect -re "(\\d+)" {
    set result $expect_out(1,string)
}
send_user "command exit with result code : $result"

This will take the content of the variable $? (which is the exit code of the prevously ended command) and save it to $result.

Upvotes: 1

Related Questions