如何将一个变量从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所有的建议!
不知道该接受什么,所有的答案真的帮助我,因为我从每个人身上学到了很多东西。
以下问题存在于你的脚本:
在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
+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
呃抱歉,你能解释一下这个$吗? -eq 0 if子句?谢谢! – 2010-08-17 18:54:15
接受了这一个,因为它最接近我最后使用的 – 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"
这不起作用,只是因为打开对话框的oascript没有执行。我需要它来选择文件 – 2010-08-17 15:27:09
@ ran2:我写的shell脚本确实调用了'oascript',但由于我不知道Applescript,所以Applescript位可能是错误的。如果你用'set -ex'替换'set -e'(这会导致shell打印执行轨迹),你看到了什么? – Gilles 2010-08-17 15:57:53
它说:++ 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
这也适用于我,因为我已经规避了萨克拉提到的问题(见评论) – 2010-08-17 18:56:29
你为什么不写在任何bash或AppleScript的一切吗?为何这种复杂性? – ghostdog74 2010-08-17 13:36:49
只是因为我不知道如何使用GUI窗口窗口并将其参数(选定文件)返回到我的shell脚本,而不使用苹果脚本。我已经阅读了Cocoadialog,但是这需要安装其他工具,这对我不起作用,因为同事也应该能够使用它。 – 2010-08-17 14:25:40