编写一个按顺序运行的 zsh 脚本

编写一个按顺序运行的 zsh 脚本

我正在使用 Big Sur,并尝试编写一个脚本来运行一个程序包(该程序包是 XSPEC,NASA 的一个光谱拟合程序包),然后运行该程序包中的命令。我首先XSPEC打开该程序包,然后我想运行data 1:1 /Users/me/Desktop/Drive/my\ data/spectrum2.pha我的问题是,如果我只是将两行用回车键隔开,第二行就不会运行,因为我假设第一行直到我退出该程序包才会终止。每当 XSPEC 启动完成后,它都会打印XSPEC version: 12.11.1 Build Date/Time: Thu Jul 1 04:09:17 2021 XSPEC12>(在三行单独的行中打印)。有没有办法制作一个 if 语句,一旦打印完前面的行,它就会进入下一步?

答案1

来自XSPEC 文档:

XSPEC 是一个命令驱动的交互式程序。XSPEC12>每当需要输入时,您都会看到提示。

这意味着,XSPEC 程序并不打算按照您尝试的方式执行。另请注意该段落的其余部分:

使用箭头键可以调用命令和内联编辑。 XSPEC 使用 Tcl 作为其用户界面,提供循环、条件、文件 I/O 等。有关 Tcl 语法的更多详细信息,请参阅附录 A 及其中的链接。

特别是,XSPEC 使用 Tcl。 Tcl 本身就是一种脚本语言。文档中的措辞表明您可以编写并使用 Tcl 脚本来指导/控制 XSPEC 程序及其操作,而不是尝试使用zsh非交互方式执行 XSPEC。相反,编写一个 Tcl 脚本来加载数据集、进行处理并输出结果。

您需要阅读 XSPEC 手册以获取有关如何执行此操作的更多信息。该手册还提供了有关如何学习/使用 Tcl 来完成此任务的链接和信息。

编辑添加:我现在也想到整data ...XSPEC 命令(Tcl 中)。因此,它是不是zsh根本就是一个命令。所以无论如何,你试图做到这一点的方式是完全错误的。您可以通过多种方式将 XSPECdata ...命令加载/执行到 XSPEC,包括外部脚本文件或 shell 重定向。再次,请阅读 XSPEC 文档以了解如何执行此操作。

答案2

干净的方法是弄清楚是否有任何方法可以知道 this XSPEC,无论是什么,已经完成加载。由于您没有向我们提供任何有关该内容的详细信息,因此恐怕我无法在这方面提供帮助。

简单、hacky 的方法是告诉您的脚本在后台启动第一个命令和启动下一个命令之间等待几秒钟。其工具是sleep,所以你想要这样的东西:

#!/bin/zsh

XSPEC &
## Now wait 5 seconds
sleep 5
## And continue
data 1:1 /Users/me/Desktop/Drive/my\ data/spectrum2.pha
wait # for XSPEC to finish

您可以尝试花时间sleep来找到始终有效的最短值。

答案3

您可以使用以下命令自动输入交互式终端应用程序预计脚本,对于 MacOS 可以通过安装自制

你会想要这样的东西

#!/usr/bin/expect -f

set timeout -1
spawn XSPEC

expect "XSPEC12>"
send -- "data 1:1 /Users/me/Desktop/Drive/my\ data/spectrum2.pha"

# Some expectation which can detect the completion of the previous step
# Further Commands

相关内容