首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AppleScript一个接一个地将命令发送到终端,并保存不能写入任何地方的输出?

如何使用AppleScript一个接一个地将命令发送到终端,并保存不能写入任何地方的输出?
EN

Stack Overflow用户
提问于 2015-12-17 13:11:32
回答 1查看 462关注 0票数 0

所以我有个问题。我从网上下载了一个程序。这是一个命令行应用程序。我编写了一个代码,它为应用程序生成了一些n-k命令。我已经将它们写入输出文件。我可以用Python编写一个应用程序,但是它会冻结一些命令。我已经手动测试了它们,似乎有两个问题:

  1. 命令必须一个接一个地运行;
  2. 有些命令给出了像bla-bla-bla这样的输出,这个东西不会写入输出文件中。所以,如果我运行一个命令./app -p /file1 -o /file2 -s -a smth- > /fileOutput.txtfileOutput.txt是空的,尽管在终端中,有这样一条bla-bla-bla消息,说明出了问题。如果命令给bla-bla-bla,应用程序可能会冻结一段时间。

以下是我想做的事:

  1. CD进入文件夹,包含应用程序;
  2. For command in fileWithCommands执行命令并启动下一个命令,只有当前面的命令完成时;
  3. 如果命令给出了包含bla-bla-bla的消息(因为它看起来像file1 bla-bla-bla),那么将命令和这个奇怪的输出写入badOutputs.txt文件。

以前从未做过applescript。然而,到目前为止,这就是我所做的:

代码语言:javascript
复制
set theFile to "/Users/MeUser/Desktop/firstCommand"
set fileHandle to open for access theFile
set arrayCommand to paragraphs of (read fileHandle)
#I have found the previous code here: http://alvinalexander.com/mac-os-x/applescript-read-file-into-list-array-examples
close access fileHandle
tell application "Terminal"
    activate
    do script "cd /Users/MeUser/Desktop/anApp/"
    repeat with command in arrayCommand
        do script command
    end repeat
end tell

尽管存在问题,但如果在一个窗口中,命令构成了一个巨大的队列。如果没有window 1,cd和命令在不同的窗口中。我仍然无法保存输出。

更新

按照@Mark 的建议做的。所以现在我有了这样的代码:

代码语言:javascript
复制
set theFile to "/Users/meUser/Desktop/firstCommand"
set fileHandle to open for access theFile
set arrayCommand to paragraphs of (read fileHandle)
close access fileHandle
repeat with command in arrayCommand
    do shell script "cd /Users/meUser/Desktop/App/; " & command
end repeat

在命令中,我添加了以下内容:

代码语言:javascript
复制
2>&1 /Users/meUser/Desktop/errorOut.txt

然而,苹果脚本说,应用程序的错误就是脚本的错误。即:文件损坏,应用程序失败。我希望它写入错误文件,在错误文件中失败并移动到下一个命令,而脚本只是失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 16:43:54

也许不是一个完整的解决方案,但不仅仅是一种评论,更容易用这种方式格式化.

第一期

你写在终端上的命令行应用程序可能写的是stderr,而不是stdout。尝试将stderr重定向到与stdout相同的位置,使用

代码语言:javascript
复制
./app -p ... > /FileOutput.txt 2>&1

第二期

你不能这样做:

代码语言:javascript
复制
do shell script cd somewhere
do shell script do_something

因为每个do shell script都将在中执行一个单独的、无关的进程。因此,您的第一个进程将启动--与所有进程一样,在默认目录中启动--并正确地更改目录,然后退出。然后,您的第二个进程将启动--与所有进程一样,在默认目录中启动--并尝试运行您的命令。而不是这样,你可以这样做:

代码语言:javascript
复制
do shell script "cd somewhere; do_something"

它启动一个进程,该进程改变目录,然后在那里运行命令行程序。

第三期

你为什么要把你的命令发送到终端?用户是否需要在终端中看到某些内容--似乎不太可能,因为您想要捕获输出,不是吗?你就不能用do shell script运行命令吗?

第四期

如果希望将正常输出与错误输出分开,则可以:

代码语言:javascript
复制
./app ... params ... > OutputFile.txt 2> errors.txt

建议1

您可以保留所有脚本中的所有错误,并将它们累加到一个文件中,如下所示:

代码语言:javascript
复制
./app .. params .. >> results.txt 2>&1

这可能使您以后能够单独处理错误。

建议2

您可以将shell脚本的输出捕获到Applescript变量中,比如ScriptOutput,这样您就可以解析它:

代码语言:javascript
复制
set ScriptOutput to do shell script "..."

建议3

如果您的脚本导致的错误正在停止循环,您可以像这样将它们封装在一个try block中,这样就可以处理这些错误,并且一切都继续进行:

代码语言:javascript
复制
try
   do shell script "..."
on error errMsg
   display dialog "ERROR: " & errMsg
end try
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34335446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档