Как я могу добавить подстановочный знак в переменную, чтобы передать "сделать сценарий оболочки?" - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть каталог на удаленном сервере с именем A00122-StupidLongNameThatIHaveToKeep. У меня есть AppleScript для копирования файлов на сервер, используя только номер проекта. Перед копированием я хочу убедиться, что путь действителен. Для этого я подумал, что могу послать команду через S SH, чтобы проверить, существует ли проект, и получить полное имя, используя find

set projectNumber to A00122
set projectPath to do shell script "ssh " & uName & "@server.com '( find /Volumes/HardDrive/ -type d -maxdepth 1 -name '" & projectNumber & "*' )'"

Ожидаемая команда оболочки:

`ssh username@server.com '( find /Volumes/HardDrive/ -type d -maxdepth 1 -name 'A00122*'`

Который должен возвращать /Volumes/HardDrive/A00122-StupidLongNameThatIHaveToKeep

Но вместо этого я получаю: no matches found: A00122*

Как мне добавить подстановочный знак в мою переменную и передать его do shell script?

1 Ответ

2 голосов
/ 30 апреля 2020

Здесь есть две основные 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 * ").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...