用期望的代码运行几个bash脚本并让它们运行

我有一堆几个bash脚本,将执行一些需要用户input的操作,因此我使用它期望。

但是,我需要一个继续运行。 但是如果我使用expect,那么expect命令将等待脚本运行,而我的主脚本将不会继续。

IE:script1以root身份产生一个脚本:

#!/bin/bash expect << EOF spawn su root -c "/bin/bash script2.sh" expect "Password:" send "test\n" set timeout -1 expect eof; EOF 

script2.sh会产生一个屏幕

 #!/bin/bash screen -dm nastyscript.sh 

nastyscript.sh会产生一个必须保持运行的二进制文件:

 #!/bin/bash expect << EOF spawn mybinary expect "*Enter password for my binary" send "test\r" expect "*I am running" set timeout -1 expect -re . { exp_continue } eof { exit } expect eof; EOF 

但是,由于一个脚本正在等待期望完成,我的主要脚本将不会继续。

任何方式来做到这一点?

首先,你绝对不希望发送密码与期望。 除了非常糟糕的风格,它完全破坏了系统的安全性,因为你必须以明文方式存储用户密码。 而且这个时代的每个人都知道,永远不应该以明文存储任何密码。

我会build议阅读sudoers的manpage。 然后,您可以在脚本中使用sudo,而不必将密码存储在明文中。 更可靠的解决scheme可能是一个suid root的可执行文件。 由于安全原因,Shell脚本不能有suid,所以这需要编译一个小程序。

另一方面,如果您确定需要多个进程并行运行,那么bash版本4将以coproc关键字的forms提供解决scheme。 基本上你把coproc放在命令行前面。 对于简单的命令,它与命令行末尾的&大致相同; 该过程将与您的脚本并行运行。 不同之处在于使用coproc可以在COPROC数组中提供其他进程的stdoutstdin文件描述符,因此脚本可以与其他进程进行通信。 请参阅http://www.gnu.org/software/bash/manual/html_node/Coprocesses.html

那么在脚本退出之前,您也可能要wait另一个进程。