Объединение переменных в Bash для формирования команды, отправленной в AppleScript с помощью команды osascript

Я пытаюсь заставить этот сценарий работать. Это Баш скрипт, который должен взять некоторые переменные, собрать их вместе и использовать результат для отправки AppleScript. Ручная вставка строки эхом отозвалась от переменной to_osa за osascript -e чтобы терминал работал так, как я хочу и ожидаю. Но когда я пытаюсь объединить команду osascript -e и в строке to_osa, он не работает. Как я могу это сделать?

the_url=""http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash""
the_script='tell application "Safari" to set the URL of the front document to '
delimiter="'"
to_osa=${delimiter}${the_script}${the_url}${delimiter}
echo ${to_osa}
osascript -e ${to_osa}

в дополнение к работа вручную скрипт также работает, когда я пишу нужную команду скрипту, а затем выполняю ее:

echo "osascript -e" $to_osa > ~/Desktop/outputfile.sh
sh  ~/Desktop/outputfile.sh

2 ответов


как правило, не ставьте двойные кавычки в переменную, ставьте их вокруг переменной. В этом случае это сложнее, так как у вас есть некоторые двойные кавычки для цитирования уровня bash и некоторые для цитирования уровня AppleScript; в этом случае кавычки уровня AppleScript идут в переменной, кавычки уровня bash идут вокруг переменной:

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\""
the_script='tell application "Safari" to set the URL of the front document to '
osascript -e "${the_script}${the_url}"

кстати, используя echo чтобы проверить такие вещи, как это, очень вводит в заблуждение. echo говорит вам, что переменная, а не то, что будет выполняться при ссылке на переменную в командной строке. Самая большая разница в том, что echo печатает свои аргументы после они прошли через разбор bash (цитата и удаление escape и т. д.), Но когда вы говорите "вручную вставляя строку ... работает" вы говорите, что это то, что вы хотите до парсинг. Если кавычки есть в Эхо-строке, это означает, что bash не распознал их как кавычки и удалил их. Сравнить:

string='"quoted string"'
echo $string          # prints the string with double-quotes around it because bash doesnt't recognize them in a variable
echo "quoted string"  # prints *without* quotes because bash recognizes and removes them

строка затирания исполняемого кода подвержена ошибкам и злу, и здесь нет абсолютно никакой необходимости. Тривиально передавать аргументы в AppleScript, определяя явный обработчик "run":

on run argv -- argv is a list of strings
    -- do stuff here
end run

который вы затем вызываете так:

osascript -e /path/to/script arg1 arg2 ...

кстати, если ваш скрипт требует фиксированного количества args, вы также пишете его так:

on run {arg1, arg2, ...} -- each arg is a string
    -- do stuff here
end run

...

идя дальше, вы даже можете сделать AppleScript непосредственно исполняемым, как вы любой другой скрипт. Во-первых, добавьте hashbang следующим образом:

#!/usr/bin/osascript

on run argv
    -- do stuff here
end run

затем сохраните его в несжатом текстовом формате и запустите chmod +x /path/to/myscript чтобы сделать файл исполняемым. Затем вы можете выполнить его из оболочки следующим образом:

/path/to/myscript arg1 arg2 ...

или, если вы не хотите указывать полный путь каждый раз, поместите файл в /usr/local/bin или какой-то другой каталог, который находится на пути вашей оболочки:

myscript arg1 arg2 ...

...

вот как вы должны писать ваш оригинальный скрипт:

#!/bin/sh
the_url="http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash"
osascript -e 'on run {theURL}' -e 'tell application "Safari" to set URL of document 1 to theURL' -e 'end run' $the_url

быстрый, простой и очень надежный.

--

p.s. Если вы предпочитаете открывать URL-адрес в новом окне, а не в существующем, см. manpage для OS X's .