Печать каталога с пробелами - PullRequest
0 голосов
/ 25 мая 2019

У меня есть следующий оператор печати:

stat <- paste("scp /home/owner/run2/reports/", x, "_EC.zip /home/adam/Desktop/Link\ to\ Software\ Project/Experiments/exp_20/run2/results/", sep = "")

Когда я печатаю оператор stat, я получаю следующий результат:

scp /home/owner/run2/reports/modelTable_EC.zip /home/adam/Desktop/Link to Software Project/Experiments/exp_20/run2/results/

Как вы можете видеть часть Link\ to\ Software\ Project печатается без символа \, который необходим, когда я использую этот путь в терминале (терминал ubuntu).

Как мне избежать этой проблемы?

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Поскольку вы хотите, чтобы это работало в терминале, вы можете поместить проблемный путь в (одинарные) кавычки.

x <- "modelTable"

stat <- paste("scp /home/owner/run2/reports/", x, "_EC.zip '/home/adam/Desktop/Link\ to\ Software\ Project/Experiments/exp_20/run2/results/'", sep = "")
## Using cat prints it without the extra quotes
cat(stat)
## scp /home/owner/run2/reports/modelTable_EC.zip '/home/adam/Desktop/Link to Software Project/Experiments/exp_20/run2/results/'
1 голос
/ 25 мая 2019

Я предлагаю вам рассматривать командную строку как последовательность команд и аргументов вместо длинной строки.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])
0 голосов
/ 25 мая 2019

более простой воспроизводимый пример

x <- "modelTable"
stat <- paste0("reports/", x, "_EC.zip /home/link\ to\ Software\ Project/Experiments/")
> stat
[1] "reports/modelTable_EC.zip /home/link to Software Project/Experiments/"

Можете ли вы использовать "/"?

stat1 <- paste0("reports/", x, "_EC.zip /home/link/ to/ Software/ Project/Experiments/")
stat1
#[1] "reports/modelTable_EC.zip /home/link/ to/ Software/ Project/Experiments/"

Иначе избежать побега \ символ

stat2 <- paste0("reports/", x, "_EC.zip /home/link\\ to\\ Software\\ Project/Experiments/")
stat2
#[1] "reports/modelTable_EC.zip /home/link\\ to\\ Software\\ Project/Experiments/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...