Объединение переменных в 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 .