2010-08-17 232 views
5

我有以下腳本如何將一個變量從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

回答

5

以下問題存在於你的腳本:

在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

2

首先,您需要從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

2

認識到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

相關問題