如何将一个变量从applescript传递给一个shell脚本?

问题描述:

我有以下脚本如何将一个变量从applescript传递给一个shell脚本?

#!/bin/bash 
/usr/bin/osascript << EOT 
set myfile to choose file 
EOT 

no_ext=$(python -c "print '$myfile'.split('.')[0]") 

### this works - just need to know how to pass the arg 
R CMD Sweave no_ext.Rnw 
pdflatex no_ext.tex 
open no_ext.pdf 

任何人都可以点我“如何正确传递变量MYFILE”?

编辑 Thx所有的建议!

不知道该接受什么,所有的答案真的帮助我,因为我从每个人身上学到了很多东西。

+0

你为什么不写在任何bash或AppleScript的一切吗?为何这种复杂性? – ghostdog74 2010-08-17 13:36:49

+0

只是因为我不知道如何使用GUI窗口窗口并将其参数(选定文件)返回到我的shell脚本,而不使用苹果脚本。我已经阅读了Cocoadialog,但是这需要安装其他工具,这对我不起作用,因为同事也应该能够使用它。 – 2010-08-17 14:25:40

以下问题存在于你的脚本:

在AppleScript的部分设置变量不成为封闭的shell脚本定义。您必须使用命令替换与shell脚本进行数据交换。

从shell脚本调用的AppleScripts不允许进行用户交互,因为它们没有应用程序上下文。您可以使用助手应用程序“AppleScript Runner”来运行用户交互命令。

这里是你的脚本的修改版本,其中的问题是固定的:

#!/bin/bash 

myfile=$(/usr/bin/osascript << EOT 
tell app "AppleScript Runner" 
    activate 
    return posix path of (choose file) 
end 
EOT) 

if [ $? -eq 0 ] 
then 
    echo $myfile 
else 
    echo "User canceled" 
fi 
+0

+1的推理。尽管我已经用我的方法解决了这个问题,使用:mkdir -p foo.app/Contents/MacOS mv foo.sh foo.app/Contents/MacOS/foo chmod + x foo.app/Contents/MacOS/foo – 2010-08-17 18:48:38

+0

呃抱歉,你能解释一下这个$吗? -eq 0 if子句?谢谢! – 2010-08-17 18:54:15

+0

接受了这一个,因为它最接近我最后使用的 – 2010-08-17 19:26:36

首先,您需要从Applescript到bash中获取myfile变量的内容。我不知道Applescript,所以我会在黑暗中拍摄如何写入其标准输出。然后python部分只是不必要的复杂性(无论如何,你可能错了,你在第一个.而不是最后一个之后扔掉了所有东西)。接下来,您需要在bash语法中的变量名之前使用$。我想下面的脚本你想要做什么:(set -e开头立刻使外壳的出口,如果发生错误,而不是试图执行pdflatex即使没有.tex文件已生产或诸如此类)

#!/bin/sh 
set -e 
myfile=$(osascript <<EOT 
set myfile to choose file 
write myfile to stdout 
EOT 
) 
no_ext="${myfile%.*}" 
R CMD Sweave "$no_ext.Rnw" 
pdflatex "$no_ext.tex" 
open "$no_ext.pdf" 

+0

这不起作用,只是因为打开对话框的oascript没有执行。我需要它来选择文件 – 2010-08-17 15:27:09

+0

@ ran2:我写的shell脚本确实调用了'oascript',但由于我不知道Applescript,所以Applescript位可能是错误的。如果你用'set -ex'替换'set -e'(这会导致shell打印执行轨迹),你看到了什么? – Gilles 2010-08-17 15:57:53

+0

它说:++ oascript ./test2:第7行:oascript:命令未找到 + myfile = – 2010-08-17 16:09:23

认识到applescript路径冒号“:”分隔。你需要在bash中用斜杠分隔,所以用“posix路径”这个applescript术语来说。另外,当使用osascript时,它不能打开对话窗口。您必须告诉应用程序打开窗口。接下来,你从applescript“返回”一些东西......这就是bash。最后,在bash中执行一个命令并将结果赋给一个变量,在命令周围使用``。所以知道这是一个shell脚本来使用applescript来获取myFile变量。

#!/bin/bash 

myFile=`/usr/bin/osascript << EOT 
tell application "Finder" 
activate 
set myfile to choose file with prompt "Select the file to use in bash!" 
end tell 
return (posix path of myfile) 
EOT` 

echo $myFile 
+0

这也适用于我,因为我已经规避了萨克拉提到的问题(见评论) – 2010-08-17 18:56:29