在我的~/.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
答案 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
读取和执行命令。