Как передать переменную ОТ яблочного скрипта в скрипт оболочки? - PullRequest
6 голосов
/ 17 августа 2010

У меня есть следующий скрипт

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

7 голосов
/ 17 августа 2010

В вашем скрипте существуют следующие проблемы:

Переменная, установленная в разделе AppleScript, становится определенной в прилагаемом скрипте оболочки. Вы должны сделать обмен данными со сценарием оболочки, используя подстановку команд.

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
2 голосов
/ 17 августа 2010

Поймите, что пути яблочного сценария - это двоеточие ":" с разделителями.Вам нужно разделить косой чертой в bash, так что в терминах appleScript это «путь posix».Кроме того, при использовании osascript он не может открывать диалоговые окна.Вы должны сказать приложению, чтобы открыть окно.Далее, вы «возвращаете» что-то из appleScript… это то, что идет в bash.Наконец, в bash для выполнения команды и присвоения результата переменной используйте `` вокруг команды.Итак, зная это, вот сценарий оболочки, который использует 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
2 голосов
/ 17 августа 2010

Во-первых, вам нужно получить содержимое переменной 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 в начале заставляет оболочку немедленно завершиться при возникновении ошибки, вместо попытки выполнить pdflatex, даже если нет .texфайл был создан или такой.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...