2016-08-25 4 views
3

に私は、R`Terminal`対`システム() `R

system("Message=HelloWoRld;echo $(sed 's/R/r/' <(echo ${Message}))") 

が、それは失敗に以下のコピーは、端末に貼り付けるとき

Message=HelloWoRld 
echo $(sed 's/R/r/' <(echo ${Message})) 

が正常に動作しながら実行してみました。この問題は<(..)に関連しているようです。 which bashまたはsystem("which bash")のいずれかを実行すると、私は/bin/bashになります。

system()経由で同じコマンドを送信するか、ターミナルウィンドウで直接コマンドを実行しても同じ出力が得られないのはなぜですか? FYI


、私はMac OS X 10.11.3にしています。 BashはGNU bash, version 3.2.57(1)であり、RはR version 3.2.3である。

+1

ことを認識していませんでした他の環境であなたのprev Qをラップする場所。プロセスサブの代わりにパイプを試してください。 – shellter

+1

外側の 'echo'は冗長です;' system( "Message = HelloWoRld;' System = "HelloWoRld; – chepner

+0

@shellterこれは、OPの現在のコードと同じ問題を抱えています(つまり、シェルによっては動作しません)。実際、両方のソリューション –

答えて

7

systemは端末エミュレータではなく、Bashを実行していません。あなたの端末はBashを実行します。 systemと同じ効果を得るには、Bashの中でコマンドを実行します。例えば。

system('bash -c \'echo $(date)\'') 

さらに、現在のBashコマンドはかなり複雑で、不要なコマンド呼び出しを使用します。はるかに簡単

sed s/R/r/ <<< $Message 

@chepnerは別のソリューションがバッシュに実行を渡す必要がなくsystemに直接使用することができるという優れたポイントを作る経由して、あなたは同じことを達成することができます:

system("Message=HelloWoRld; echo $Message | sed 's/R/r/'") 
+0

実際には、 'system( 'bash -c \' Message = HelloWoRld; echo $(sed" s/R/r/"<(エコー$ {メッセージ}))\ '''のように動作します。だから、どの言語が 'system(" .. ")'に入力すべきでしょうか?シェルスクリプトのようなものですか? '/ usr/bin/'は 'system(..) 'が使用する言語ですか?ありがとうございます –

+0

@ Remi.bそれはあなたのシステムによって異なります。詳しくは、 'system'ドキュメントを参照してください。 Macでは、コマンドはおそらく '/ bin/sh'を通して実行されますが、私はそれを一般的なルールとして頼りません。特に、これは設計上、Windowsでは決して動作しません。 –

+2

すべてのPOSIX準拠システムでは、デフォルトのシェルとして '/ bin/sh'が使用されています。 '/ bin/sh'を実装するために使用される実際のシェルは、シェルがPOSIX準拠の方法で入力を実行する限り、一般的に無関係です。 – chepner