2015-05-18 19 views
5

Nel mio file ~/.bash_profile ho messo questo comando alias:R: Comando Alias ​​chiamato con il sistema()

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

Funziona benissimo dalla shell bash, ma quando io lo chiamo dall'interno R con system ottengo un comando non trovato:

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 

Altre variabili ambientali in bash_profile sono correttamente riconosciuti da R/system(). Qualche idea su come/se può essere riparato?

Si tratta di informazioni di sessione 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

Hai provato ad aggiungere 'system ('mvsync --help', intern = TRUE)' – pacomet

+0

@pacomet Nessuna fortuna ho paura (vedi post modificato), ma grazie. – dariober

+0

Un alias è un bash-ism, non un shell-ism (suona contraddittorio, lo so). Prova 'system (" bash -i -c mvsync ")' (il '-i' è importante per ottenere bash per accedere a funzioni come alias). – r2evans

risposta

1

La shell non è probabilmente una shell di login: http://linux.die.net/man/1/bash

Quando bash è invocata come una shell di login interattiva, o come un non-interattivo shell con l'opzione --login, prima legge e esegue i comandi dal file/etc/profile, se quel file esiste. Dopo aver letto quel file, cerca ~/.bash_profile, ~/.bash_login e ~/.profile, in quell'ordine, e legge ed esegue i comandi dal primo esistente ed è leggibile. L'opzione --noprofile può essere usata quando la shell viene avviata per inibire questo comportamento.

--login può funzionare ma può essere meglio mettere l'alias in .bashrc che verrà eseguito anche se non è una shell di login

0

A quanto pare, gli alias non sono espansi in shell non interattiva sessioni.

Avrai bisogno di uno eseguire

shopt -s expand_aliases

All'interno della vostra chiamata di sistema, per esempio

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

O definire la variabile d'ambiente BASH_ENV e aggiungerlo a tale file.

Problemi correlati