Проблема с параметром для объекта Swift Process - PullRequest
0 голосов
/ 30 декабря 2018

Я работаю над графическим интерфейсом для 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 не выполняет команду даты ...

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Как сказал Зафод , расширение аргументов не выполняется для аргументов, так что, в частности,

--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)" ]
0 голосов
/ 30 декабря 2018

К сожалению, в документации четко указано, что расширения оболочки не разрешены:

Строки в аргументах не подвергаются расширению оболочки, поэтому вам не нужно делать специальные кавычки и переменные оболочки, такие как$ PWD, не разрешены.

Источник: https://developer.apple.com/documentation/foundation/process/1408983-arguments

Так что то, что вы пытаетесь сделать, не может быть сделано таким образом.

Вы пыталисьвстроить небольшой скрипт оболочки, скажем run.sh со своим собственным #!/bin/sh и вашей командной строкой, и запустить его с объектом Process?

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