Я пытаюсь запустить некоторый Perl из R, используя system
: просто назначая строку (предоставленную в R) переменной и эхо ее. (system
вызов выполняется в /bin/sh
)Выполнение Perl из R - perlQuote/shQuote?
echo <- function (string) {
cmd <- paste(shQuote(Sys.which('perl')),
'-e',
shQuote(sprintf("$str=%s; print $str", shQuote(string))))
message(cmd)
system(cmd)
}
# all fine:
# echo('hello world!')
# echo("'")
# echo('"')
# echo('foo\nbar')
Однако, если я пытаюсь echo
обратной косой черты (или действительно любой строки, оканчивающиеся на обратной косой черты), я получаю сообщение об ошибке:
> echo('\\')
'/usr/bin/perl' -e "\$str='\\'; print \$str"
Can't find string terminator "'" anywhere before EOF at -e line 1.
(Примечание: обратная косая черта перед $
в порядке, так как это защищает /bin/sh
от мышления $str
- это переменная оболочки).
Ошибка в том, что Perl интерпретирует последний \'
как внедренный кавычки в $str
в отличие от сбежавшего обратной косой черты. На самом деле, чтобы получить Perl эхо обратной косой черты, что нужно сделать
> echo('\\\\')
'/usr/bin/perl' -e "\$str='\\\\'; print \$str"
\ # <-- prints this
То есть, мне нужно, чтобы избежать мои обратные слэши для Perl (в дополнение ко мне избежать их в R/Баш).
Как я могу обеспечить в echo
, что строка, которую вводит пользователь, является строкой, которая печатается? то есть единственный уровень экранирования, который необходим, находится на уровне R?
i.e есть какая-то функция perlQuote
функция аналог до shQuote
? Должен ли я просто избегать всех обратных косых черт в моей функции echo
? Есть ли другие символы, которые мне нужно избегать?
(Я пытаюсь сделать пакет 'cowsay' для R, чтобы объединиться с пакетом' fortunes', поэтому вопрос для хорошей причины!;)) –