Здесь есть две основные c сложности: во-первых, часть, из которой вы строите команду find
, собирается на go через три различных уровня разбора - сначала AppleScript, затем локальным shell, и, наконец, удаленной оболочкой - и каждый слой будет анализировать, применять и удалять слой кавычек и / или экранировок. И во-вторых, цитаты не вкладываются; похоже, вы пытаетесь использовать комбинацию одинарных кавычек и скобок, чтобы получить нерасширенный подстановочный знак на двух уровнях разбора оболочки, и это просто не работает таким образом.
Давайте go через три слоя, чтобы увидеть, где вещи go с треков. Начните с команды AppleScript:
set projectPath to do shell script "ssh " & uName & "@server.com '( find /Volumes/HardDrive/ -type d -maxdepth 1 -name '" & projectNumber & "*' )'"
AppleScript анализирует и удаляет двойные кавычки (вместе со вставкой переменных), давая что-то вроде этого:
ssh fred@server.com '( find /Volumes/HardDrive/ -type d -maxdepth 1 -name 'A00122*' )'
^----------------------------------------------------^ ^--^
По сути, вы сказали, что вы хотел, но он не будет делать то, что вы хотите, потому что (как я уже сказал) цитаты не вкладываются. Когда оболочка проанализирует это, она будет рассматривать разделы, которые я подчеркнул, как заключенные в одинарные кавычки, а раздел между ними - который, как я думаю, вы намеревались поместить в два уровня кавычек, - как полностью не заключенный в кавычки! Теперь, тот факт, что A00122*
отсутствует в кавычках, не имеет значения на этом этапе (если у вас на локальном компьютере нет действительно странно именованных файлов), но проблема в том, что все из этих кавычек будут удалены перед отправкой команды в удаленную оболочку. Итак, что получает удаленная оболочка:
( find /Volumes/HardDrive/ -type d -maxdepth 1 -name A00122* )
Поскольку A00122*
не находится в кавычках, удаленная оболочка попытается развернуть ее в список подходящих файлов, что (по-видимому) завершается неудачно и сообщение об ошибке предполагает, что удаленная оболочка zsh, которая жалуется на несоответствующие символы подстановки (по умолчанию). Кроме того, обратите внимание, что скобки здесь не делают ничего полезного; Я думаю, что они могли быть предназначены для того, чтобы позволить кавычкам вкладываться, но это не сработало.
Итак, предложение 1: удалите круглые скобки и «внутренние» одинарные кавычки и добавьте escape (который имеет удвоить, чтобы обойти AppleScript) для подстановочного знака:
set projectPath to do shell script "ssh " & uName & "@server.com 'find /Volumes/HardDrive/ -type d -maxdepth 1 -name " & projectNumber & "\\*'"
Предложение 2: если вы выполняете поиск только на глубину 1, почему бы просто не позволить оболочке расширить подстановочный знак и echo
результат:
set projectPath to do shell script "ssh " & uName & "@server.com 'echo " & projectNumber & "*'"
... и затем проверьте, начинается ли результат с "A00122-" (обратите внимание, что значение da sh здесь важно, поскольку оболочки, отличные от zsh, вероятно, вернутся) A00122 * ").