使用AppleScript通过Echo Off向Terminal.app发送命令和字符串

时间:2011-04-03 13:56:17

标签: cocoa macos terminal applescript

我想要完成的事情就像这个this question中描述的那样。基本上使用AppleScript将命令发送到Terminal.app。

然而,我不想要这种行为:使用do script指令发送的每个命令都会回显给终端。我目前正在将AppleScript与Cocoa集成,有时软件会将敏感信息(如密码)发送到终端。

是否有某种方法可以禁用此行为,例如DOS批处理文件中的@echo off指令?

修改

为了澄清我的问题,我会详细说明。假设我们有一个像这样的AppleScript:

tell application "Terminal"
    set currentTab to do script "login"
    do script "username" in currentTab
    do script "password" in currentTab
end tell

我注意到如果终端应用程序已经运行,无论是否打开任何终端窗口,do script指令中的命令都会在它被送到shell之前被回显。要在终端中说明上述脚本的结果:

Last login: Tue 5 Apr hh:mm:ss on ttys001
login        <--\
username     <----unwanted echoes
password     <--/
<machine>:~ <user>$ login
username: username
password: ****
... (interactive Terminal session)

但是,如果Terminal.app未在脚本执行时运行,则不会发生这种情况。

2 个答案:

答案 0 :(得分:1)

在shell有机会响应之前你正在“输入”东西(在这种情况下,在login有机会关闭回声之前)。诸如expect之类的工具解决了编写任意命令行实用程序脚本的问题,这在一般情况下是更好的解决方案,但是从你的问题中你不清楚你要做什么。

你试图编写什么命令,为什么要通过终端进行编写?

答案 1 :(得分:0)

要隐藏Terminal.app中的命令,请先运行以下命令:

stty -echo

再次显示命令:

stty echo

您也可以直接从AppleScript运行命令,而不是使用Terminal.app:

set theResult to do shell script "cal -y 2011"

甚至更好,使用NSTask直接从Objective-C运行命令 (因为你的应用程序正在使用Cocoa,我认为它已经(部分)用Objective-C编写)