Как установить оболочку, используемую системой () для вызова скриптов bash в R? [Дубликат]

вы также можете использовать «Debug.Print myXmlVariable» в коде, и он будет автоматически записывать в ближайшее окно, когда он встречает код во время выполнения или по мере того, как вы проходите через него.

2
задан madness 28 November 2016 в 14:25
поделиться

1 ответ

Вызовите /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) следующим образом:

execl("/bin/sh", "sh", "-c", command, (char *) 0);

(см. man 3 system)

Таким образом, вы должны вызывать /bin/bash и передайте тело сценария с помощью опции -c.

Тестирование

Перечислим каталоги верхнего уровня в /tmp с использованием Bash-specific mapfile:

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 функции должны быть вызваны с использованием указанной оболочки.

5
ответ дан Ruslan Osmanov 16 August 2018 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: