Я предлагаю вам рассматривать командную строку как последовательность команд и аргументов вместо длинной строки.R system
не дает вам никакой справедливости, а system2
чуть лучше: хотя он поощряет думать о команде как о векторе ее компонентов (будь то команда, дефис-аргументы или файлы / пути), он просто наивно объединяетстроки без учета кавычек или что-то еще.
Я защищаюсь, используя shQuote
.Хорошо, что он будет работать с файлами / путями, даже если он им не нужен, поэтому вы не сможете эффективно использовать его.(Обычно нет необходимости использовать его с аргументами дефиса, но некоторые инструменты (многие?) Все равно не работают и работают, поэтому технически
$ ssh "-v" "/home/owner/..." "/home/adam/Desktop/..."
должно прекрасно работать в оболочке.
Итак, shQuote
все, что напоминает путь. (Я говорю «напоминаю» с предположением, что вещи формируются программно ... статическим аргументам это строго не нужно, хотя, как я уже говорил ранее, этого не должно быть)больно.)
cmd <- c("scp", shQuote(paste0("/home/owner/run2/reports/", x, "_EC.zip")),
shQuote("/home/adam/Desktop/Link\ to\ Software\ Project/Experiments/exp_20/run2/results/"))
cmd
# [1] "scp"
# [2] "\"/home/owner/run2/reports/modelTable_EC.zip\""
# [3] "\"/home/adam/Desktop/Link to Software Project/Experiments/exp_20/run2/results/\""
Чтобы распечатать его на консоли, чтобы можно было скопировать его и вставить в терминал / оболочку:
cat(paste(cmd, sep = " "), "\n")
# scp "/home/owner/run2/reports/modelTable_EC.zip" "/home/adam/Desktop/Link to Software Project/Experiments/exp_20/run2/results/"
Или вы можете простозапустить его из R напрямую:
system2(cmd[1], args = cmd[-1])