вы также можете использовать «Debug.Print myXmlVariable» в коде, и он будет автоматически записывать в ближайшее окно, когда он встречает код во время выполнения или по мере того, как вы проходите через него.
Вызовите /bin/bash
и передайте команды с помощью опции -c
одним из следующих способов:
system(paste("/bin/bash -c", shQuote("Bash commands")))
system2("/bin/bash", args = c("-c", shQuote("Bash commands")))
Если вы хотите запустить файл Bash , поставьте его с помощью shebang , например:
#!/bin/bash -
builtin printf %q "/tmp/a b c"
, и вызовите его, передав путь сценария к функции system
:
system("/path/to/script.sh")
Подразумевается, что текущий пользователь / группа имеет достаточные разрешения для выполнения сценария.
Раньше я предлагал установить переменную среды SHELL
, Но это, вероятно, не сработает, так как реализация функции system
в R вызывает функцию C с тем же именем (см. src/main/sysutils.c
):
int R_system(const char *command)
{
/*... */
res = system(command);
И
Функция библиотеки
system()
используетfork(2)
для создания дочернего процесса, который выполняет команду оболочки, указанную в команде, используяexecl(3)
следующим образом:blockquote>
execl("/bin/sh", "sh", "-c", command, (char *) 0);
(см.
man 3 system
)Таким образом, вы должны вызывать
/bin/bash
и передайте тело сценария с помощью опции-c
.Тестирование
Перечислим каталоги верхнего уровня в
/tmp
с использованием Bash-specificmapfile
:test.R
script <- ' mapfile -t dir < <(find /tmp -mindepth 1 -maxdepth 1 -type d) for d in "${dir[@]}" do builtin printf "%s\n" "$d" done > /tmp/out' system2("/bin/bash", args = c("-c", shQuote(script)))
test.sh
Rscript test.R && cat /tmp/out
Примерный выход
/tmp/RtmpjJpuzr /tmp/fish.ruslan ...
Оригинальный ответ
Попробуйте установить переменную среды
SHELL
:Sys.setenv(SHELL = "/bin/bash") system("command")
Затем команды переданы в
system
илиsystem2
функции должны быть вызваны с использованием указанной оболочки.