Macos 如何在Mac OS X的终端窗口中串联运行shell脚本

Macos 如何在Mac OS X的终端窗口中串联运行shell脚本,macos,bash,shell,unix,Macos,Bash,Shell,Unix,在我的Desktop/src/目录中,我有一些shell脚本,我想在一系列中运行,其中一些脚本必须在第一个脚本完成运行后运行,所有命令都必须在新的终端窗口上运行。我正在Mac OS X上工作 到目前为止,我已经尝试了以下代码 osascript<<EOF tell application "System Events" tell process "Terminal" to keystroke "n" using command down end tell application "

在我的Desktop/src/目录中,我有一些shell脚本,我想在一系列中运行,其中一些脚本必须在第一个脚本完成运行后运行,所有命令都必须在新的终端窗口上运行。我正在Mac OS X上工作

到目前为止,我已经尝试了以下代码

osascript<<EOF
tell application "System Events"
tell process "Terminal" to keystroke "n" using command down
end

tell application "Terminal"
activate
do script with command "cd Desktop/src/ && sh startRM1.sh"
end tell

tell application "Terminal"
activate
do script with command "cd Desktop/src/ && sh startRM2.sh"
end tell

tell application "Terminal"
activate
do script with command "cd Desktop/src/ && sh startRM3.sh"
end tell
EOF
问题是startRM1.sh需要一点时间启动,而startRM2.sh、startRM3.sh直接启动并崩溃,因为它们必须等待startRM1.sh完成 所有三个都必须在新窗口中启动


编辑:startRM1.sh是一个持续运行的服务器;因此,控件永远不会进入第二步

使用以下方法解决问题

osascript<<EOF
tell application "System Events"
tell process "Terminal" to keystroke "n" using command down
end

tell application "Terminal"
activate
do script with command "cd Desktop/src/ && sh startRM1.sh" in window 1
end tell

tell application "Terminal"
activate
do script with command "sleep 5 && cd Desktop/src/ && sh startRM2.sh"
end tell

tell application "Terminal"
activate
do script with command "sleep 5 && cd Desktop/src/ && sh startRM3.sh"
end tell
EOF

创建一个shell脚本,它是您的起点

您可以创建一个.sh文件,该文件可以调用:

source mynewShell.sh

其中,它将包含所有其他文件,按您需要的顺序调用,以及任何配置数据等

startRM1.sh是一个持续运行的服务器,我忘了添加它,因此控件永远不会进入第二步。我尝试了您的解决方案,但由于RM1.sh是一个服务器,它从未进入第二步。您如何判断startRM1.sh何时启动,以及启动是什么意思?为什么希望由startRM1.sh启动的服务器有自己的终端窗口?通常,您在后台运行服务器,并将输出发送到日志文件。而且,正如Jidder所问的,您如何知道何时运行startRM2.sh或startRM3.sh是安全的?当startRM1.sh运行时,它显示服务器正在运行上下文,并且它还注册由startRM2.sh和startRM3.sh查找的rmi注册表。我已经解决了这个问题。我在问题中添加了您关于“因此控制从未进入第二步”的评论,但这似乎与“startRM2.sh,startRM3.sh直接启动并崩溃”的观察结果相矛盾。[…秒后…]哦,你已经解决了你的问题。@JonathanLeffler我想在一个新的终端上运行服务器进行测试,我正在检查功能,必须在终端上显示工作情况。我通过在startRM1.sh之后的程序前面添加睡眠来解决这个问题