Я работаю над графическим интерфейсом для rclone (и rsync) и использую объект Process для выполнения удаленных команд. Он работает очень хорошо, но теперь у меня есть проблема, которую я не могу решить.
Аргументы объекта Process - это массив строк. Следующая команда работает должным образом при вставке команды в окно терминала.
/usr/bin/rclone sync /Users/thomas/test/source local:/Users/thomas/test/dest --verbose --backup-dir=local:/Users/thomas/test/dest_backup --suffix=`date "+-%Y-%m-%d"`
Проблема в последнем аргументе: --suffix=`date "+-%Y-%m-%d"`.
Аргумент (при вставке команды в терминал) добавляет суффикс даты для удаленных и измененных файлов.
Строка аргументов в Swift:
arguments = [....
"--verbose",
"--backup-dir=local:/Users/thomas/test/dest_backup",
"--suffix=`date \"+-%Y-%m-%d\"`"]
В результате суффикс для файлов резервных копий становится строкой, а не датой выполнения.
Объект Process не выполняет команду date ...





К сожалению, в документации четко указано, что расширения оболочки не разрешены:
The strings in arguments do not undergo shell expansion, so you do not need to do special quoting, and shell variables, such as $PWD, are not resolved.
Источник: https://developer.apple.com/documentation/foundation/process/1408983-arguments
Так что то, что вы пытаетесь сделать, не может быть выполнено таким образом.
Вы пробовали встроить небольшой сценарий оболочки, скажем, run.sh с собственным #!/bin/sh и своей командной строкой, и запустить его с объектом Process?
Как и Зафод сказал, расширение оболочки для аргументов не выполняется, так что, в частности,
--suffix=`date "+-%Y-%m-%d"`
дословно передается команде rclone без оценки команды между обратными кавычками.
Но вместо этого вы можете вычислить аргумент, используя DateFormatter:
let formatter = DateFormatter()
formatter.dateFormat = "-yyyy-MM-dd"
let dateSuffix = formatter.string(from: Date()) // -2018-12-30
let arguments = [ // ....
"--verbose",
"--backup-dir=local:/Users/thomas/test/dest_backup",
"--suffix=\(dateSuffix)" ]
Спасибо, я посмотрю, смогу ли я вычислить строку даты перед выполнением. Проблема в том, что параметр выбирается пользователем. Я мог бы вычислить дату загрузки приложения (github.com/rsyncOSX/rcloneosx). У меня есть другой графический интерфейс для rsync (github.com/rsyncOSX/RsyncOSX). Суффикс даты для rsync расширяется на удаленном компьютере. Я полагаю, что rclone расширяет параметр в локальной ОС, а затем передает суффикс в облачную службу ...
Хм, спасибо - не знал об этих ограничениях, передача команд оболочки в быстром режиме в rsync работает, rsync расширяет команду оболочки на удаленном сервере .. добавление этой строки --suffix = _
date +'%Y-%m-%d.%H.%M'в качестве аргумента в Swift работает на удаленных компьютерах, но не если местом назначения является локальный подключенный том в macOS ..