如何在bash脚本中使用错误代码

时间:2013-12-10 16:45:56

标签: macos bash shell expect

如果之前有人问过道歉,我无法找到答案......

我为OS X创建了一个bash脚本来安装AFP共享。该脚本成功运行,并允许用户使用cocoa对话框

将其用户名和密码键入图形弹出窗口

我的问题是,如果输入的用户名和密码不正确,我希望能够显示一个新的弹出窗口来解释这一点。

我试图根据脚本的退出状态执行此操作,但无论挂载是否成功,脚本都返回0

脚本如下;

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

如果我通过Terminal或Textmate运行,我会收到以下内容(例如)

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.

所以mount_afp正在给我一条消息,然后我想在我的脚本中使用...但是退出代码为0,我不知道如何获取该消息以便使用

有什么想法吗? (希望有意义!)

2 个答案:

答案 0 :(得分:1)

要获取衍生命令的退出代码,请使用以下内容:

# 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"

这将获取变量$?的内容(这是当前结束命令的退出代码)并将其保存到$result

答案 1 :(得分:0)

感谢所有回复,帮助我指明正确的方向

我最终采用这种方法并将expect命令设置为变量

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)