如何将变量FROM applescript传递给shell脚本?

时间:2010-08-17 13:30:59

标签: macos shell applescript

我有以下脚本

 #!/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”吗?

EDIT 感谢所有建议!

不知道接受什么,所有的答案都对我很有帮助,因为我从每个人那里学到了很多东西。

3 个答案:

答案 0 :(得分:7)

您的脚本中存在以下问题:

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 :(得分:2)

首先,您需要将Applescript中的myfile变量的内容转换为bash。我不知道Applescript,所以我会在黑暗中拍摄如何写入其标准输出。然后python部分只是不必要的复杂性(并且可能是错误的,你在第一个.而不是最后一个之后扔掉了所有东西)。接下来,在bash语法中变量名之前需要$。我认为以下脚本可以满足您的需求:

#!/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"

(开头set -e会在发生错误时立即退出shell,而不是尝试执行pdflatex,即使没有生成.tex文件或者某些文件。)

答案 2 :(得分:2)

意识到applescript路径是冒号“:”分隔的。你需要在bash中使用斜杠分隔,所以在Applecript中这就是“posix路径”。此外,使用osascript时无法打开对话框窗口。您必须告诉应用程序打开窗口。接下来,你从applecript中“返回”某些内容......这就是bash的内容。最后,在bash中执行命令并将结果赋值给变量使用``around the command。所以知道这是一个使用applescript来获取myFile变量的shell脚本。

#!/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