Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R: Alias command called with system()

In my ~/.bash_profile file I put this alias command:

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

It works fine from the bash shell but when I call it from within R with system I get a command not found:

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

Other environmental variables in bash_profile are correctly recognized by R/system(). Any idea how/if it can be fixed?

This is the R session info:

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   
like image 653
dariober Avatar asked May 18 '15 14:05

dariober


2 Answers

Your shell is probably not a login shell: http://linux.die.net/man/1/bash

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

--login may work but it may be better to put your alias in .bashrc which will be executed even if it is not a login shell

like image 129
teambob Avatar answered Nov 07 '22 20:11

teambob


You can solve this issue by using system2 and using bash in interactive mode, i.e. by adding -i, or as login shell (-l) depending on where you add your aliases.

Example when your aliases are assigned in your ~/.bashrc:

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

from man bash we learn that

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login [-l] option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

[...]

When an interactive shell that is not a login shell is started [-i], bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.

like image 28
loki Avatar answered Nov 07 '22 21:11

loki