R:使用system()

时间:2015-05-18 14:31:39

标签: r bash .bash-profile

在我的~/.bash_profile文件中,我放了alias命令:

which mvsync
alias mvsync='rsync --remove-source-files -arvuP'
    /usr/bin/rsync

它可以从bash shell中正常工作但是当我在R中使用system调用它时,我得到一个未找到的命令:

R
system('mvsync --help')
sh: mvsync: command not found

## Or
system('mvsync --help', intern=TRUE)
sh: mvsync: command not found
Error in system("mvsync --help", intern = TRUE) : 
  error in running command

## Or
system("bash -i -c mvsync")
bash: mvsync: command not found

[4]+  Stopped                 R

R / system()可以正确识别bash_profile中的其他环境变量。 知道如何/如果它可以修复?

这是R会话信息:

sessionInfo()
R version 3.1.3 (2015-03-09)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: CentOS release 6.6 (Final)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] graphics  grDevices utils     datasets  stats     methods   base     

other attached packages:
[1] ggplot2_1.0.0    data.table_1.9.4

loaded via a namespace (and not attached):
 [1] chron_2.3-45     colorspace_1.2-4 digest_0.6.8     grid_3.1.3       gtable_0.1.2     MASS_7.3-39      munsell_0.4.2    plyr_1.8.1       proto_0.3-10     Rcpp_0.11.3      reshape2_1.4     scales_0.2.4     stringr_0.6.2   

3 个答案:

答案 0 :(得分:3)

您的shell可能不是登录shell:http://linux.die.net/man/1/bash

  

当bash作为交互式登录shell或具有--login选项的非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。在读取该文件之后,它按顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。启动shell以禁止此行为时,可以使用--noprofile选项。

- 登录可能有效,但最好将你的别名放在.bashrc中,即使它不是登录shell也会被执行

答案 1 :(得分:0)

显然,在非交互式shell会话中不会扩展别名。

您需要运行

system('bash -l',input=c("shopt -s expand_aliases","mvsync --help"))

在您的系统调用中,例如

BASH_ENV

或者定义<span>环境变量并将其添加到该文件中。

答案 2 :(得分:0)

您可以通过使用system2并在交互模式下使用bash来解决此问题,即添加-i或作为登录shell(-l),具体取决于您在何处添加别名。

~/.bashrc中分配别名的示例:

system2('/bin/bash', args = c('-ic', shQuote('mvsync --help')))

man bash中我们了解到

  

当bash作为交互式登录shell或使用--login [-l]选项作为非交互式shell调用时,它首先从文件/etc/profile中读取并执行命令,如果该文件存在。读取该文件后,它将按该顺序查找~/.bash_profile~/.bash_login~/.profile,并从第一个存在且可读的命令中读取并执行命令。在启动外壳程序以禁止此行为时,可以使用--noprofile选项。

     

[...]

     

启动不是登录shell的交互式shell [-i]时,bash从/etc/bash.bashrc~/.bashrc中读取并执行命令(如果存在这些文件)。使用--norc选项可以禁止这种情况。 --rcfile file选项将强制bash从文件而不是/etc/bash.bashrc~/.bashrc读取和执行命令。