R中的`Terminal` vs`ystem()`

Rem*_*i.b 4 macos bash r

我尝试在R中运行以下命令

system("Message=HelloWoRld;echo $(sed 's/R/r/' <(echo ${Message}))")
Run Code Online (Sandbox Code Playgroud)

但它失败了

Message=HelloWoRld
echo $(sed 's/R/r/' <(echo ${Message}))
Run Code Online (Sandbox Code Playgroud)

复制粘贴在终端时工作正常.这个问题似乎与此有关<(..).当我做任何一个which bash或者system("which bash"),我得到/bin/bash.

为什么通过system()或直接在终端窗口上的相同命令不会产生相同的输出?


仅供参考,我在Mac OS X 10.11.3.Bash是GNU bash, version 3.2.57(1)和R是R version 3.2.3.

Kon*_*lph 8

system不是终端模拟器,它没有运行Bash.你的终端运行Bash.要获得相同的效果system,请在Bash中运行命令.例如

system('bash -c \'echo $(date)\'')
Run Code Online (Sandbox Code Playgroud)

更重要的是,您当前的Bash命令非常复杂,并使用不必要的命令调用; 你可以通过更简单的方式实现同​​样的目标

sed s/R/r/ <<< $Message
Run Code Online (Sandbox Code Playgroud)

@chepner提出了另一个解决方案可以直接使用system而无需将执行传递给Bash的优点:

system("Message=HelloWoRld; echo $Message | sed 's/R/r/'")
Run Code Online (Sandbox Code Playgroud)

  • 所有符合POSIX标准的系统都使用`/ bin/sh`作为默认shell; 用于实现`/ bin/sh`的实际shell通常是无关紧要的,只要shell以符合POSIX的方式执行其输入. (2认同)