【问题标题】:How to pass a variable FROM applescript TO a shell script?如何将变量从 applescript 传递到 shell 脚本?
【发布时间】:2010-08-17 13:30:58
【问题描述】:

我有以下脚本

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

编辑 感谢所有建议!

不知道该接受什么,您的所有回答都对我很有帮助,因为我从大家那里学到了很多东西。

【问题讨论】:

  • 为什么不用bash 或applescript 编写所有内容?为什么这么复杂?
  • 只是因为我不知道如何使用 GUI 窗口窗口并将其参数(选定文件)返回到我的 shell 脚本,而不使用苹果脚本。我已经阅读了有关 Cocoadialog 的信息,但这需要安装对我不起作用的额外工具,因为同事也应该能够使用它。

标签: macos shell applescript


【解决方案1】:

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

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

不允许从 shell 脚本调用的 AppleScript 进行用户交互,因为它们没有应用程序上下文。您可以使用帮助应用程序“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
  • 接受了这个,因为它最接近我最终使用的内容
  • $? -eq 0 是 bash 测试子句。它测试 osascript 命令返回的退出状态是否为 0。如果用户取消文件选择对话框,您将获得非零状态。
  • 我可以将它包装在 if 子句中,例如 if [$1 =''] 使用你所说的 else 使用 $1 作为文件名吗?
  • 使用 if [-z "$myfile" ] 测试 $myfile 是否包含空字符串。见topherdotcom.com/scribble/bash/bash-test-operators
【解决方案2】:

首先,您需要将myfile 变量的内容从Applescript 获取到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 文件或类似的东西。)

【讨论】:

  • 那不行,只是因为打开对话框的oascript没有执行。我需要它来选择文件
  • @ran2:我编写的 shell 脚本确实调用了oascript,但 Applescript 位可能是错误的,因为我不知道 Applescript。如果将 set -e 替换为 set -ex(这会导致 shell 打印执行跟踪),您会看到什么?
  • 它说:++ oascript ./test2: line 7: oascript: command not found + myfile=
  • @ran2:这是我的错字,已修复。
  • Thx no_ext="${myfile%.*}" 真的很有帮助。 :) 这就是 python 的用途 :) .
【解决方案3】:

意识到applescript 路径是用冒号“:”分隔的。您需要在 bash 中用斜杠分隔,所以在 applescript 术语中,这就是“posix 路径”。此外,使用 osascript 时,它无法打开对话窗口。您必须告诉应用程序打开窗口。接下来,你从applescript“返回”一些东西......这就是bash。最后,在 bash 中执行命令并将结果分配给一个变量,在命令周围使用 ``。所以知道这里是一个使用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

【讨论】:

  • 这也适用于我,因为我已经绕过了 sakra 提到的问题(见评论)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多