我有以下脚本
#!/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 感谢所有建议!
不知道接受什么,所有的答案都对我很有帮助,因为我从每个人那里学到了很多东西。
答案 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