2014-07-23 128 views
2

我试图构建一个AppleScript来启动我的shell脚本。苹果脚本从同一目录运行bash脚本

路径结构如下

/Users/ryan/myscript/ 
    applescript.scpt 
    bash.sh 

我的AppleScript如下:

tell application "Terminal" 
      set folder_path to path to me 
      set run_cmd to "/bin/bash " & folder_path & "/bash.sh" 
      do script run_cmd 
      activate 
end tell 

问题就是“路径我”并不总是返回正确路径。当使用执行了Mac cd/dvd自动播放行为folder_path等于:

disk:System:Library:CoreServices:SystemUIServer.app:Contents:XPCServices:com.apple.systemuiserver.scriptrunner.xpc:

是否有得到的文件夹路径的更好的办法?

+0

将脚本保存为应用程序是否有所作为? – Vic

回答

1

我的路径指正在运行的applescript的位置。因此,如果您的脚本位于磁盘上,那么它将引用保存脚本的磁盘上的位置

如果希望shell脚本始终存在于当前用户存在的名为“myscripts”的文件夹中文件夹,然后你可以使用路径当前用户文件夹,并从那里

set user_folder to path to current user folder 
set folder_path to quoted form of POSIX path of (("" & user_folder & "myscript")) 

tell application "Terminal" 
    activate 
    set run_cmd to "/bin/bash " & folder_path & "/bash.sh" 
    do script run_cmd 
end tell 
+0

在我的Mac上,'我的路径'并不总是等于applescript所在的路径。不幸的是,我需要它运行bash.sh相对于苹果脚本路径 – Ryan

+0

你有没有试过把我的路径从终端告诉块? – mcgrailm

+0

它没有任何区别,它仍然参考Apple CoreServices系统文件夹 – Ryan

0

打造出来的。如果这个脚本是在一个静态的位置,你可以这样做:

do shell script "/bin/bash" & POSIX path of (path to current user folder) & "myscript/bash.sh" 
+0

,而不是它是一条线,这与我发布的内容有什么不同? – mcgrailm

+0

这不需要通过激活等终端应用程序来运行。为了实现简洁的脚本,我将7行260个字符压缩为94个字符的行。 –

1

有,为什么你有一个理由将shell脚本存储在单独的文件中?通常情况下,您可以将它内联在AppleScript代码中。据我所知,“do shell脚本”命令只能对文本进行操作,而不能对文件路径上的脚本进行操作。如果给它一个包含路径的变量,它将尝试将该路径作为命令运行。它不会将该文件的内容作为命令运行。

这里是运行一个内嵌的shell脚本,并把结果在文本编辑一个AppleScript的例子:

property theShellScript : "#!/bin/bash 
echo Hello World" 

tell application "TextEdit" 
    activate 
    set theScriptResult to do shell script theShellScript 
    make new document 
    set the text of document 1 to theScriptResult 
end tell 

...你当然可以用自己的shell脚本的内容替换上面的shell脚本。

如果您确实需要将脚本保存在单独的文件中,那么最好的方法是将AppleScript保存为应用程序,然后将shell脚本放在Application捆绑包中。 “我的路径”是运行脚本的应用程序的路径 - 而不是脚本本身 - 但是如果您将AppleScript保存为应用程序,那么它会运行自己的脚本,并且“我的路径”与您最初一样工作预期。

这里是运行包含在存储它自己的应用程序包内的文件内的外壳脚本一个AppleScript的例子:

property theApplicationPath : the path to me as text 
property theShellScriptPath : theApplicationPath & "Contents:Resources:Scripts:bash.sh" 

tell application "TextEdit" 
    open alias theShellScriptPath 
    set theShellScript to the text of document 1 
    set theScriptResult to do shell script theShellScript 
    make new document 
    set the text of document 1 to theScriptResult 
end tell 

根据上述脚本复制/粘贴到在AppleScript的编辑一个新的文档,按住Option键并选择文件▶另存为,然后在保存对话框的文件格式弹出菜单中选择“应用程序”,当然给你的应用程序一个名字并点击保存。然后在Finder中,导航到您保存应用程序的位置,并在应用程序中双击(或右键单击),然后选择“显示软件包内容”。这会将您的应用程序作为文件夹打开,从而将文件系统暴露在内。把你的shell脚本文件命名为“bash”。sh“放入应用程序内的”Contents/Resources/Scripts“文件夹内,然后关闭代表您的应用程序的窗口。

现在,当您从文件系统中的任何位置运行应用程序时,它仍然能够查找并运行其合并的shell脚本。

+0

西蒙,第二部分或者你的回答可能是OP所需要的,但这只是一个猜测。至于将bash脚本存储在一个单独的文件中,我猜测它很冗长,并且混合这两种语言可能非常困难。这是我的两美分;) – mcgrailm