Техническое примечание TN2065

сделайте сценарий оболочки в AppleScript

Этот Technote отвечает на часто спрашиваемые вопросы о AppleScript, делают команду сценария оболочки, представленную в AppleScript 1.8.

Это техническое примечание задает общие вопросы о том, как использовать, делают сценарий оболочки. Это не пытается объяснить, что можно сделать со сценарием оболочки Unix или как записать тот; для этого найдите надлежащий текст Unix или консультируйтесь с локальным экспертом. Это структурировано как вопрос-и-ответ, таким образом, можно или пропустить право на проблему или прочитать с начала до конца.

Некоторые ответы обращаются к «страницам справочника»; это справочные документы, включенные в Mac OS X. («Человек» короток для «руководства».) Для наблюдения страницы справочника для команды откройте Окно терминала и тип man сопровождаемый названием команды, например, man echo.

Выдача команд
Получение ответа
Контакт с текстом
Контакт с файлами
Другие проблемы
Окровавленные подробные данные
История версии документа

Выдача команд

Как я передаю переменную AppleScript своей команде оболочки?

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

set hostname to "www.apple.com" do shell script "ping -c1 " & hostname

Некоторые команды требуют, чтобы данные питались к стандартному вводу. сделайте сценарий оболочки непосредственно не поддерживает это, но можно фальсифицировать его использование echo и канал:

set input to "hello" do shell script "echo " & input & " | tr a-z A-Z" -- "HELLO"

В целом необходимо заключить любое использование переменных в кавычки quoted form of; посмотрите Контакт с текстом для подробных данных.

Моя команда хорошо работает в Терминале, но когда я пытаюсь использовать его в, делают сценарий оболочки, я получаю ошибку о «команде, не найденной». Что продолжается?

Существует две возможности. Во-первых, сделайте сценарий оболочки всегда использует/bin/sh для интерпретации команды, не оболочки по умолчанию, которую использует Терминал. (Для обнаружения, какова оболочка по умолчанию сказать echo $SHELL в Терминале.), В то время как некоторые команды являются тем же между оболочками, другие не, и Вы, возможно, использовали одного из них. Если Вы пишете Ваш, делают сценарии сценария оболочки в Терминале сначала, всегда используют sh. Можно запустить sh путем ввода /bin/sh; ввести exit возвращаться к Вашей нормальной оболочке.

Во-вторых при использовании просто названия команды вместо полного пути оболочка использует список каталогов (известный как PATH), чтобы попытаться найти полный путь к команде. Для безопасности и причин мобильности, сделайте сценарий оболочки игнорирует конфигурационные файлы, которые считала бы интерактивная оболочка, таким образом, Вы не получаете настройки, Вы имели бы в Терминале. Используйте полный путь для команды, например, /sbin/ifconfig вместо просто ifconfig. Для нахождения полного пути в Терминале сказать which command-name, например, which ifconfig; чтобы видеть, что список мест делает, сценарий оболочки будет искать, говорить do shell script \"echo $PATH\".

(Этот ответ заминает несколько подробных данных — видят Окровавленные Подробные данные, если Вы заботитесь.)

Почему не выполняет работу сценария оболочки точно как Терминал?

По двум причинам: во-первых, это помогает гарантировать, что сценарии будут работать на различных системах без модификации. Если бы делают сценарий оболочки использовал Вашу оболочку по умолчанию или PATH, Ваш сценарий, вероятно, повредился бы, если бы Вы дали его кому-то еще. Во-вторых, это соответствует механизмы Escape оболочки на других языках, таких как Perl.

Как я выполняю свою команду с оболочкой кроме sh?

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

do shell script "/bin/tcsh my-command-file-path"

Некоторые оболочки примут сценарий в качестве параметра, как это:

do shell script "/bin/tcsh -c 'my-command'"

И большинство примет сценарий от стандартного ввода, как это:

do shell script "echo my-command | /bin/tcsh"

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

Как я могу использовать больше чем одну команду на сингле, делают сценарий оболочки? Например, я хочу к CD к некоторому каталогу и затем выполняю некоторую работу, но это не помнит рабочий каталог от одного вызова до следующего.

Каждый вызов делает сценарий оболочки использует новый процесс оболочки, таким образом, состояние, такое как изменения в переменных и рабочем каталоге не сохраняется от одного до следующего. Чтобы сделать несколько команд в единственном вызове, разделите команды точками с запятой как это:

do shell script "cd ~/Documents; ls" -- result: "Welcome.txt"

Используя перевод строки (символ ASCII 10) также работает.

Как я получаю права администратора для команды?

Используйте administrator privileges, user name и password параметры как это:

do shell script "command" user name "me" password "mypassword" with administrator privileges

user name и password являются дополнительными; при исключении имени пользователя сделайте сценарий оболочки предполагает, что он текущий пользователь; при исключении пароля он попросит пароль, когда он будет работать. Как только сценарий правильно аутентифицируется, он не попросит аутентификацию снова в течение пяти минут. С Mac OS X 10.4, этот льготный период не расширяется ни на какие другие сценарии или на остальную часть системы; вручную вызов sudo -k является ненужным.

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

Примите во внимание, что права администратора позволяют Вам изменять любой файл где угодно в системе. Можно представить незагрузочную систему или даже стереть весь диск с несколькими командами в хорошем состоянии, таким образом осуществить предостережение. Еще лучше не используйте права администратора, если Вы абсолютно не имеете к. Если Вы не делаете разработку системного уровня, Вы никогда не должны должны быть изменяться, что-либо в Системе / — изменяющийся / Библиотека должно быть достаточным.

do shell script "/usr/bin/perl -Ue '$< = $>; system(@ARGV)' my_command" with administrator privileges

Mac OS X 10.4.2 набора и реальные и эффективные идентификаторы пользователей; обходное решение, описанное здесь, будет ненужным, но безопасным.

set normal_command to "command1; command2" do shell script "sh -c " & quoted form of normal_command with administrator privileges

С Mac OS X 10.4, можно использовать with administrator privileges с многократными командами, как описано в, «как может, я использую больше чем одну команду» выше; никакое обходное решение не необходимо.

Какой длины моя команда может быть? Каково максимальное количество символов?

Нет никакого точного ответа на этот вопрос. (См. Окровавленные Подробные данные по причинам почему.) Однако приблизительный ответ - то, что единственная команда может составить приблизительно 262 000 символов в длину — технически, 262 000 байтов, принимая один байт за символ. Символы неASCII будут использовать по крайней мере два байта за символ — посмотрите Контакт с текстом для большего количества подробных данных.

Переполнение предела вызовет, делают сценарий оболочки для возврата ошибки типа 255. Большинство людей, поразивших предел, пытается подать встроенные данные к своей команде. Рассмотрите запись данных к файлу и чтению его оттуда вместо этого.

Получение ответа

Как действительно делает, сценарий оболочки получает результат? Как я возвращаю переменную оболочки в свой AppleScript?

Команды Shell могут записать свои результаты в один из двух потоков вывода: стандартный вывод и стандартная погрешность. В то время как стандартная погрешность для сообщений об ошибках и диагностики, стандартный вывод для нормального вывода. Принятие Вашего сценария завершается успешно — если это не делает, посмотрите следующий вопрос — результатом является любой текст, был распечатан к стандартному выводу, возможно с некоторыми модификациями. Большинство команд распечатывает свои результаты к стандартному выводу автоматически, таким образом, Вы не должны делать ничего дополнительного. Если Ваш ответ будет в переменной, то необходимо будет распечатать его сами использование echo (большинство оболочек) или print (много языков, таких как Perl и Awk). Например:

  Набор перечисления 1 переменная AppleScript mySlug к дате откладывает в формате yyyy-mm-dd.

set mySlug to do shell script "date +%Y-%m-%d" -- see the 'date' man page for details on the format string.

Перечисление 2  та же вещь, но как сценарий Perl.

set mySlug to do shell script ¬     "perl -e 'my (undef, undef, undef, $d, $m, $y) = localtime;               my $date = sprintf("%4d-%02d-%02d", $y+1900, $m+1, $d);               print $date'"

По умолчанию сделайте сценарий оболочки преобразовывает все окончания строки в результат к возвратам каретки стиля Mac (» \r» или символ ASCII 13) и удаляет единственное окончание строки запаздывания, если Вы существуете. Это означает, например, что результат do shell script \"echo foo; echo bar\" \"foo\\rbar\", не \"foo\\nbar\\n\" то эхо фактически возвратилось. Можно подавить оба из этих способов поведения путем добавления without altering line endings параметр. Для контакта с данными неASCII посмотрите Контакт с текстом.

Как действительно делает ошибки отчета сценария оболочки?

Все команды оболочки возвращают целочисленное состояние, когда они заканчивают: обнулите средний успех; что-либо еще означает отказ. Если выходы сценария с ненулевым состоянием, сделайте сценарий оболочки бросает ошибку AppleScript с состоянием как код ошибки. (Страница справочника для команды должна сказать Вам, какие коды состояния она может возвратить. Большинство команд просто использует 1 для всех ошибок.), Если сценарий распечатал что-то к потоку стандартной погрешности, тот текст становится сообщением об ошибке в AppleScript. Если не было никакого текста ошибки, нормальный вывод (если таковые имеются) используется в качестве сообщения об ошибке.

Когда я выполняю свою команду в Терминале, я получаю набор вывода, но при использовании делают сценарий оболочки, часть его отсутствует.

При выполнении в Терминале стандартный вывод и стандартная погрешность оба отправляются в то же место, таким образом, трудно сказать им независимо. сделайте сценарий оболочки, с другой стороны, разделяет эти два потока. Если Вы хотите объединить их, следовать за командой с 2>&1 как это:

do shell script "command 2>&1"

См. sh страницу справочника при «Перенаправлении» для большего количества подробных данных.

Сколько выведенный может возвратить команда?

Единственная команда может возвратить до 1 ГБ данных.

Контакт с текстом

Когда параметр имеет пробелы или определенную пунктуацию — круглые скобки, $, *, и т.д., моя команда не работает правильно.

Поскольку оболочка разделяет параметры пробелами, и некоторые знаки препинания имеют особые значения, необходимо предпринять специальные шаги, чтобы заставить оболочку обработать строку как один параметр с литеральными пробелами, круглыми скобками, и т.д. Это вызывают, «заключая в кавычки», и существует несколько способов сделать это, но самое простое и самое эффективное должны использовать quoted form свойство строк.

Например, рассмотрите этот (ошибочный) обработчик, берущий строку и добавляющий ее к файлу, названному «материалом» в Вашем корневом каталоге:

to append_message(s)     do shell script "echo " & s & " >> ~/stuff" end append_message

Это хорошо работает для большинства строк, но если мы вызываем его со строкой как «100$», строка, заканчивающаяся в файле, «00», потому что оболочка думает, что «1$» является переменной, значение которой является пустой строкой. (Переменные в sh начинаются со знака доллара.) Для фиксации сценария измените его как это:

do shell script "echo " & quoted form of s & " >> ~/stuff"

quoted form свойство дает строку в форме, которая безопасна от дальнейшей интерпретации оболочкой, независимо от того каково ее содержание. Для получения дополнительной информации на заключении в кавычки, см. sh страницу справочника при «Заключении в кавычки».

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

Строки в AppleScript идут от вводной двойной кавычки до заключительной двойной кавычки. Для помещения литеральной двойной кавычки в строку, необходимо «выйти» из него с символом наклонной черты влево, как это:

"a \"quote\" mark"

Средние значения наклонной черты влево «обрабатывают следующий символ особенно». Это означает, что получение литеральной наклонной черты влево требует двух наклонных черт влево, как это:

"a back\\slash"

Помещая это все вместе, у Вас могло бы быть что-то вроде этого:

set s to "this is a test." do shell script "echo " & quoted form of s & " | perl -n -e 'print \"\\U$_\"'" -- result: "THIS IS A TEST."

Несмотря на все дополнительные наклонные черты влево в сценарии, фактическая строка, переданная-e опции perl,

print "\U$_"

Каждый раз, когда мой сценарий оболочки возвращает двойную кавычку или наклонную черту влево, он выпускает дополнительную наклонную черту влево перед ним.

Окно результата показывает Вам результат в «исходной» форме, такой, что Вы могли вставить его в сценарий и скомпилировать его. Это означает, что строковые результаты имеют кавычки вокруг них, и специальных символов, таких как двойные кавычки и наклонные черты влево оставляют, как описано выше. Дополнительная наклонная черта влево не является действительно частью строки, это просто, как это выведено на экран. Если Вы передаете строку display dialog или запишите его в файл, Вы будете видеть его без дополнительных наклонных черт влево.

Что действительно делает, сценарий оболочки делает с НЕТЕКСТОМ ASCII (символы с диакритикой, японский язык, и т.д.)?

С точки зрения AppleScript сделайте сценарий оболочки принимает и производит текст Unicode. сделайте сценарий оболочки передает команды оболочке и интерпретирует их вывод с помощью UTF-8. Если команда произведет байты, которые не являются допустимым UTF-8, сделайте то сценарий оболочки интерпретирует их использующий основное системное кодирование.

Поймите, что большинство команд оболочки абсолютно неосведомлено о Unicode и UTF-8. UTF-8 похож на ASCII для символов ASCII — например, A байт 0x41 дюйм и ASCII и UTF-8 — но любой символ неASCII представлен как последовательность байтов. Насколько команды оболочки затронуты, однако, один байт равняется одному символу, и они не предпринимают попытки интерпретировать что-либо вне диапазона ASCII. Это означает, что они сохранят последовательности UTF-8 и могут сделать точные соответствия байта для байта: например, echo \"™\" произведет символ товарного знака, и grep \"©\" найдет каждую строку с символом авторского права. Однако они не могут разумно сортировать, изменить или сравнить последовательности UTF-8: например, команды соответствия набора символов как tr или [] создают в sed попытается соответствовать каждый байт последовательности независимо, sort сортирует символы с диакритикой не в порядке, и grep -i или find -iname не будет соответствовать «В» против «Р». Perl является существенным исключением к этому; дополнительную информацию см. в perlunicode странице справочника.

До Mac OS X 10.4, выводит, который не является допустимым UTF-8, произведет ошибку, «не может превратить некоторые данные в ожидаемый тип». Обходные решения включают запись вывода в файл и затем чтения его команда чтения AppleScript использования или передача по каналу через vis. С 10,4, выводит, который не является допустимым UTF-8, будет интерпретироваться с помощью основного системного кодирования.

Каковы правила для окончаний строки?

Существует две различных строки конечные соглашения в Mac OS X: стиль Mac (строки заканчиваются возвратом: «\r» или символ ASCII 13) и Стиль Unix (строки заканчиваются переводом строки: «\n» или символ ASCII 10). Команды Shell обычно только обрабатывают окончания строки Стиля Unix, таким образом давая им, текст стиля Mac приведет к меньше полезным результатам. Например, grep полагал бы, что весь ввод имеет только одну строку, таким образом, Вы получите самое большее одно соответствие.

Если Ваши данные прибывают из AppleScript, можно преобразовать окончания строки там или генерировать переводы строки во-первых — \"\\n\" или ASCII character 10 оба приводят к переводу строки. Если Ваши данные прибывают из файла, можно заставить сценарий оболочки преобразовать окончания строки при помощи TR. Например, следующее найдет строки, содержащие «что-то» в любом файле простого текста. («Заключенная в кавычки форма пути POSIX f» идиома обсуждена при Контакте с Файлами.)

set f to choose file do shell script "tr '\\r' '\\n' > " & quoted form of POSIX path of f & " | grep something"

Сам AppleScript является конечным агностиком строки — paragraph элемент строки и текстовых объектов Unicode полагает, что Mac, Unix и окончания строки стиля Windows эквивалентны. Обычно нет никакой потребности использовать text item delimiters получить строки текста Стиля Unix; paragraph n или every paragraph будет работать точно также. (Однако, если бы Вы хотели рассмотреть только окончания строки Стиля Unix, то текстовые разделители элемента были бы надлежащим решением. Кроме того, до AppleScript 1.9.1 текстовые объекты Unicode только полагали, что возврат и символ разделителя абзацев Unicode были концами абзаца.)

Контакт с файлами

Я имею файл AppleScript или искажаю объект; как я передаю его команде оболочки?

Оболочка указывает файлы с помощью путей POSIX, которые являются строками с наклонными чертами, разделяющими компоненты контура (например, /folder1/folder2/file). Для получения пути POSIX файла AppleScript или объекта псевдонима используйте POSIX path свойство. (Однако посмотрите следующий вопрос.), Например:

POSIX path of file "HD:Users:me:Documents:Welcome.txt" -- result: "/Users/me/Documents/Welcome.txt"

Чтобы пойти другим путем — говорят, что Ваша команда оболочки возвращается, путь POSIX в результате — используют POSIX file класс. POSIX file с путем оценивает к нормальному объекту файла, что можно тогда передать другим командам AppleScript. Например:

set p to do shell script "echo ~" POSIX file p -- result: file "HD:Users:me:"

Если файл имеет определенные символы на свое имя — пробелы, круглые скобки, $, *, и т.д., путь POSIX не работает правильно.

Это - особый случай заключения в кавычки: необходимо заключить путь в кавычки, чтобы заставить оболочку интерпретировать всю пунктуацию буквально. Чтобы сделать это, используйте заключенную в кавычки форму пути. Например, это будет работать с любым файлом, независимо от того каково его имя:

choose file do shell script "ls -l " & quoted form of the POSIX path of the result -- result: "-rw-r--r-- 1 me unknown 1 Oct 25 17:48 Look! a file!"

Почему POSIX не соединяет каналом, просто заключают все в кавычки для меня?

По двум причинам: во-первых, существует использование для путей POSIX, не имеющих никакого отношения к параметрам оболочки, и заключение в кавычки пути было бы неправильным в таких случаях. Во-вторых, заключенная в кавычки форма полезна для вещей кроме путей к файлам. Поэтому существует две ортогональных операции вместо, каждый объединил тот.

Другие проблемы

Как я управляю интерактивным инструментом как ftp, или telnet с делают сценарий оболочки?

Короткий ответ - то, что Вы не делаете. сделайте сценарий оболочки разработан, чтобы запустить команду и затем позволить ей работать без взаимодействия, пока она не завершается, во многом как оператор одинарной левой кавычки в Perl и большинстве оболочек Unix.

Однако существуют пути вокруг этого. Можно написать сценарий Терминала и отправить ряд команд к тому же окну (хотя это только работает в Mac OS X 10.2 и позже), или Вы могли использовать пакет Unix, разработанный для сценариев интерактивных инструментов, тех, которые ожидают. Кроме того, много интерактивных команд имеют неинтерактивные эквиваленты. Например, curl может занять место ftp в большинстве случаев.

За долгое время мой сценарий произведет вывод. Как я читаю результаты, поскольку они входят?

Снова, короткий ответ - то, что Вы не делаете — делают сценарий оболочки не возвратится, пока команда не сделана. В условиях Unix это не может использоваться для создания канала. То, что можно сделать, однако, должно поместить команду в фон (см. следующий вопрос), отправьте его вывод в файл, и затем считайте файл, как это заполняется.

Я хочу запустить фоновый серверный процесс; как я умею обойтись, сценарий оболочки не ожидает, пока команда не завершается?

Использовать do shell script \"command &> file_path &\". сделайте сценарий оболочки сразу возвратится без результата, и Ваш сценарий AppleScript будет работать параллельно с Вашим сценарием оболочки. Вывод сценария оболочки войдет в file_path; если Вы не заботитесь о выводе, использовать /dev/null. Нет никакой прямой поддержки получения или управления фоновым процессом от AppleScript, но посмотрите следующий вопрос.

do shell script "command > /dev/null 2> file_path

См. sh страницу справочника при «Перенаправлении» для большего количества подробных данных.

Я запустил фоновый процесс; как я получаю его процесс ID, таким образом, я могу управлять им с другими командами оболочки?

Можно использовать функцию sh, чтобы сделать это: специальная переменная $! ID новой фоновой команды, таким образом, можно повторить ее как последнюю команду в сценарии оболочки, как это:

do shell script "my_command &> /dev/null & echo $!"
-- result: 621
set pid to the result
do shell script "renice +20 -p " & pid
-- change my_command's scheduling priority.
do shell script "kill " & pid
-- my_command is terminated.

Я пытаюсь использовать вершину, но она перестала работать, высказывание «не может получить терминальные атрибуты» или «ошибку вводный терминал: неизвестный».

вершина в ее режиме по умолчанию делает все виды умных вещей создать динамично обновляющий дисплей, ни один из которых не работает, если устройство вывода не поддерживает управление курсором, также, как и сценарий оболочки, не делает. Однако вершина имеет опцию, заставляющую ее работать в журналировании режима, работающего с подобными файлу устройствами, любят, делают сценарий оболочки. Использовать top -l1 вместо этого, или посмотрите страницу руководителя для большего количества опций.

Эта та же проблема применится к любой другой команде, принимающей присутствие терминала. К счастью, большинство из них является интерактивными фронтэндами к более примитивным командам, не принимающим терминал.

Что работает значение по умолчанию, каталог для делает команды сценария оболочки?

сделайте сценарий оболочки наследовал рабочий каталог своего родительского процесса. Для большинства приложений, таких как Редактор сценариев, это/. Для osascript это - рабочий каталог оболочки при запуске osascript. Вы не должны полагаться на значение по умолчанию рабочий каталог, являющийся ничем в частности. При необходимости в рабочем каталоге, чтобы быть где-нибудь определенными, установите его в это сами.

Это имеет значение, какое приложение я говорю, чтобы сделать сценарий оболочки?

Для самых предсказуемых результатов, всегда помещаемых, делают вызовы сценария оболочки за пределами любого говорят блок или использование tell me. На практике это обычно не имеет значения, если Вы не выполняете свой AppleScript от osascript, но не повреждает быть безопасным. (Кроме того, говоря другому приложению сделать сценарий оболочки, или действительно любое дополнение сценариев, блокирует любую другую работу, которую могло бы выполнить приложение, пока дополнение сценариев не заканчивается. Это часто считают плохой вещью.)

Проблема - то, что то, какое приложение Вы говорите, определяет среду для сценария оболочки — рабочий каталог, переменные окружения, и т.д. Большинство приложений имеет ту же среду, но полагающийся на это риск обслуживания. Если Ваш AppleScript работает в osascript, рабочая среда прибывает из оболочки osascript, был выполнен от, который является абсолютно отдельным от любого другого приложения. Рассмотрите следующий обмен в sh, работающем в Терминале:

$ VAR=something; export VAR $ osascript -e 'do shell script "echo $VAR"' something $ osascript -e 'tell application "Finder" to do shell script "echo $VAR"' (nothing)

Для больше о том, как это работает, посмотрите Окровавленные Подробные данные.

Окровавленные подробные данные

Этот раздел для тех, кто хочет знать все мелкие подробные данные того, как выполняют работы сценария оболочки. Если Вы просто хотите заставить свой сценарий работать правильно, Вы, вероятно, не должны читать его.

Какая оболочка действительно делает использование сценария оболочки, действительно?

сделайте сценарий оболочки всегда вызывает/bin/sh. Однако в Mac OS X,/bin/sh является действительно копией другой оболочки, эмулирующей sh. В 10,2 и позже, это - удар; до этого это был zsh.

Какой длины моя команда может быть, действительно?

Вызов делает сценарий оболочки создает новый процесс sh и поэтому подвергается нормальным пределам системы на передающих данных к новым процессам: параметры (в этом случае, текст Вашей команды плюс приблизительно 40 байтов издержек) и любые переменные окружения могут не быть больше, чем kern.argmax, который в настоящее время является 262 144 байтами. Поскольку делают сценарий оболочки наследовал среду своего родителя (см. следующий вопрос), точная сумма пространства, доступного для текста команды, зависит от среды вызова. На практике это выходит к несколько больше чем 261 000 байтов, но необычные параметры среды могли бы сократить это существенно.

Куда среда оболочки прибывает из — переменные окружения, рабочий каталог, и т.д.?

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

Среда покрывает рабочий каталог, любые переменные окружения, и несколько других атрибутов — видят execve (2) страница справочника для полного списка. Как упомянуто в Выдаче Команд, сделайте сценарий оболочки не читает конфигурационные файлы, что интерактивная оболочка, работающая в Терминале, была бы.

Любое приложение, запущенное от Средства поиска, получает ту же стандартную среду: рабочий каталог / и переменные окружения HOME, LANG, PATH, USER и SHELL. (Можно определить больше переменных окружения, если Вы желаете; посмотрите Технические Вопросы и ответы QA1067, Установив переменные окружения для пользовательских процессов для подробных данных.) Большинство приложений не изменяет свою среду, но полагающийся на это риск обслуживания.

osascript (1) наследовал свою среду от оболочки, от которой он выполняется: рабочий каталог является рабочим каталогом оболочки; любые переменные окружения, определенные в оболочке, будут также определены в osascript, и поэтому в делают сценарий оболочки. Например:

$ VAR=something; export VAR $ osascript -e 'do shell script "echo $VAR"' something

sh определяет много собственных переменных окружения, но те - то же независимо от того, как это выполняется.



История версии документа


ДатаПримечания
23.03.2006

Ограничение безопасности документов на сообщение других приложений с правами администратора.

20.07.2005

Обновленный вопрос «о правах администратора» отразить изменения в 10.4.2.

06.05.2005

Изменения для Mac OS X 10.4 (тигр).

27.01.2003

Новый документ, который часто Задаваемые Вопросы о AppleScript «делают сценарий оболочки» команда.