Как я могу избежать аргументов оболочки в AppleScript? - PullRequest
5 голосов
/ 15 ноября 2011

Кажется, что Applescript неправильно экранирует строки.Что я делаю не так?

Пример:

set abc to "funky-!@#'#\"chars"
display dialog abc
display dialog quoted form of abc

Ожидаемый / желаемый вывод:

funky-!@#'#"chars
'funky-!@#\'#"chars'

Фактический вывод:

funky-!@#'#"chars
'funky-!@#'\''#"chars'

AsВы можете видеть, кажется, что в фактическом выводе Applescript добавляет и экранирует лишние '

Я был бы в порядке с конечными символами, равными ' или ", и я также был бы в порядкепри этом экранируются одинарные и двойные кавычки, но, похоже, на самом деле экранируются только одинарные кавычки.

Ответы [ 3 ]

8 голосов
/ 16 ноября 2011

Обратная косая черта обычно не интерпретируется внутри одинарных кавычек в оболочках.

Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа в одинарных кавычках.Одиночная кавычка не может встречаться в одинарных кавычках.

Обратная косая черта не может использоваться для экранирования одиночной кавычки в строке, которая установлена ​​в одинарных кавычках.Встроенную кавычку можно создать, написав, например: 'a' \ '' b ', что дает a'b.

Однако они интерпретируются как echo в sh, который является оболочкойиспользуется do shell script:

do shell script "echo " & quoted form of "\\t" --> "\t"

Unsetting xpg_echo делает его похожим на эхо в bash:

do shell script "shopt -u xpg_echo; echo " & quoted form of "\\t" --> "\\t"

Часто вместо этого проще использовать перенаправление HEREDOC:

do shell script "rev <<< " & quoted form of "a\\tb" --> "b\\ta"
6 голосов
/ 15 ноября 2011

Используйте "цитируемую форму".В общем, в appleScript мы имеем дело с путем в стиле «mac», поэтому мы бы сделали что-то вроде этого, чтобы передать его в оболочку ...

set theFile to choose file
set dirname to do shell script "dirname " & quoted form of POSIX path of theFile
3 голосов
/ 02 февраля 2012

Нет, в 'funky-!@#'\''#"chars' не добавляется '.

Как уже указано 17510427541297, идиома AppleScript quoted form of предназначена для использования в оболочках Unix, а строки в оболочках Unix объединяются, если они расположены непосредственно рядом друг с другом.

AppleScript quoted form of abc просто делает это: он создает строку, заключенную в одинарные кавычки, но заменяет каждую одиночную кавычку ' вместе с этой строкой на '\''.

Фактически это создает три отдельные строки, но эти три отдельные строки подчиняются следующему механизму создания строк в (большинстве) оболочек Unix:

"funky-!@#'#\"chars" становится 'funky-!@#' +\' + '#"chars'

Результирующая строка подходит для интерпретации оболочками Unix как одна литеральная строка (без проблем с расширением параметров и т.п.).

# in Terminal.app
# note the escaping in: osascript -e '...'\''...'
quotedsrt="$(osascript -e '
set abc to "funky-!@#'\''#\"chars"
return quoted form of abc
')"

echo "$quotedsrt"                 # 'funky-!@#'\''#"chars'
eval echo "$quotedsrt"            # funky-!@#'#"chars
echo echo "$quotedsrt" | sh


# escaping mechanism for Bash shell
set +H
esc="'\''"
str="funky-!@#'#\"chars"
str="'${str//\'/${esc}}'"
set -H

echo "$str"                  # 'funky-!@#'\''#"chars'
eval echo "$str"             # funky-!@#'#"chars
echo echo "$str" | sh
...