【问题标题】:How to send a command using AppleScript to terminal one by one and save the output, which is not writable to file anywhere?如何使用AppleScript将命令一一发送到终端并保存输出,该输出不可写入到任何地方?
【发布时间】:2015-12-17 13:11:32
【问题描述】:

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

  1. 命令必须一个接一个地运行;
  2. 有些命令会给出像bla-bla-bla 这样的输出,这个东西没有写入输出文件。所以,如果我运行命令./app -p /file1 -o /file2 -s -a smth- > /fileOutput.txt fileOutput.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。然而,这就是我到目前为止所做的:

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 Setchell 的建议进行。所以现在我有这样的代码:

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

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

2>&1 /Users/meUser/Desktop/errorOut.txt

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

【问题讨论】:

  • @MarkSetchell 谢谢,它可以工作,虽然有点不清楚,如何将命令和错误写入同一个文件?我需要获取它,例如查看哪个文件已损坏或不合适。另外,如何将这些输出附加到一个文件中?我刚刚手动测试过,它会重写文件。

标签: terminal applescript


【解决方案1】:

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

第一期

您在终端上写入的命令行应用程序可能正在写入stderr 而不是stdout。尝试使用

将stderr 重定向到与stdout 相同的位置
./app -p ... > /FileOutput.txt 2>&1

第二期

你不能这样做:

do shell script cd somewhere
do shell script do_something

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

do shell script "cd somewhere; do_something"

它会启动一个更改目录的进程,然后在那里运行你的命令行程序。

问题三

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

第四期

如果您想将正常输出与错误输出分开,您可以这样做:

./app ... params ... > OutputFile.txt 2> errors.txt

建议 1

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

./app .. params .. >> results.txt 2>&1

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

建议 2

你可以将你的 shell 脚本的输出捕获到一个 Applescript 变量中,比如ScriptOutput,就像这样,然后你可以解析它:

set ScriptOutput to do shell script "..."

建议 3

如果您的脚本导致的错误正在停止您的循环,您可以像这样将它们包含在 try block 中,以便处理它们并且一切继续:

try
   do shell script "..."
on error errMsg
   display dialog "ERROR: " & errMsg
end try

【讨论】:

  • 如何在其中插入命令,因为我正在使用命令遍历数组?关于外壳。我对此有点困惑;我也对如何一一调用命令感到困惑。我试图做的有点像bash myCommands,它把所有的命令都弄得一团糟,因为它没有以某种方式一个接一个地执行它们 O_O 也许我只是不明白,但至少这是我的见。
  • 我看不到你的命令 :-)。基本上,您将创建一个以"cd somewhere; " 开头的字符串,然后一次将每个命令附加到该字符串并运行它。
  • repeat with command in arrayCommand,我做到了:do script "cd"; do script command。我如何按照你的方式制作它do shell script "cd somewhere; do_something" 是不是有点像do shell script "cd somewhere; %s" command?
  • 非常感谢,我差不多完成了。请你看一下更新吗?
  • 不知道该说什么 - 你看起来不错,但我看不到你实际执行的命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 2013-03-20
相关资源
最近更新 更多