Ric*_*rta 6 linux macos shell r amazon-linux
这个让我难过。我执行了一个简单的Shell脚本,该脚本可以在我的Linux(AWS aka CentOS)计算机上正常运行,但是在我的Mac OS X计算机上崩溃。原来\,字符串命令中的转义()需要一个额外的转义字符(\\)。
有人可以启发我了解我在这里缺少的内容吗,即,在需要此功能的Mac上运行R脚本又有什么用呢?
打电话说时,*未*观察到该行为python3 -c ..
在两台机器上,我正在使用bash,特别是/bin/bash
注意:Mac是R:3.5.1 vs 3.4.1的稍晚版本,但是如果这是罪魁祸首,我将感到非常惊讶。有人可以确认吗?
R --vanilla -e 'cat(" Hello \n World \n ")'
Run Code Online (Sandbox Code Playgroud)
上面的代码在CentOS机器上可以很好地运行,但是需要附加的转义符(\\n而不是\n)才能正确执行。(底部示例)
为了进行参考/比较,以下python命令在我测试过的每台Mac OS X,CentOS计算机上均可以相同地工作。
python3 -c 'print("Hello \n World")'
Run Code Online (Sandbox Code Playgroud)
有关详细信息,这是比较两台计算机上的两个命令的输出
1. R --vanilla -e 'cat(" Hello \n World \n ")'
2. R --vanilla -e 'cat(" Hello \\n World \\n ")'
Run Code Online (Sandbox Code Playgroud)
R --vanilla -e 'cat(" Hello \n World \n ")'
## CENTOS:
> cat(" Hello \n World \n ")
Hello
World
## MAC OS X:
> cat(" Hello
+
+ Error: unexpected end of input
Execution halted
Run Code Online (Sandbox Code Playgroud)
R --vanilla -e 'cat(" Hello \\n World \\n ")'
## CENTOS:
> cat(" Hello \\n World \\n ")
Hello \n World \n >
## MAC OS X:
> cat(" Hello \n World \n ")
Hello
World
Run Code Online (Sandbox Code Playgroud)
为了进行比较,在运行简单的python脚本时没有看到相同的行为。
## Each of these produce identical
## results in Mac OSX as CentOS
python3 -c 'print("Hello \n World")'
python3 -c 'print("Hello \\n World")'
Run Code Online (Sandbox Code Playgroud)
> cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
> R --vanilla -e 'sessionInfo()'
R version 3.4.1 (2017-06-30)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Amazon Linux AMI 2018.03
Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.4.1
Run Code Online (Sandbox Code Playgroud)
Mojave 10.14.3
> R --vanilla -e 'sessionInfo()'
R version 3.5.1 (2018-07-02)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS 10.14.3
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.5.1
Run Code Online (Sandbox Code Playgroud)
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6
Run Code Online (Sandbox Code Playgroud)
根据我的建议,即问题的原因可能是 macOSsed和 GNU之间的差异sed,以及Charles Duffy 的建议作为对原始问题的最后评论,我尝试直接在 macOS Mojave 10.14.3 上和使用 R 3.5.3 调用 R 可执行文件在shell脚本中如下:
export R_HOME=$(R RHOME)
Rexec=${R_HOME}/bin/exec/R
$Rexec --vanilla -e 'cat(" Hello \n World \n ")'
Run Code Online (Sandbox Code Playgroud)
这不会给出错误消息并给出与 Linux 上相同的输出。
在我看来,这个问题不是 bash 中的错误,而是 macOS (BSD) 和 GNU 之间令人遗憾的差异sed。如果可能的话,我不知道如何在 R 包装脚本中纠正这个问题。
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |