Почему строковые команды через `R -e ..` на Mac против Linux требуют дополнительного экранирования? - PullRequest
6 голосов
/ 18 марта 2019

Этот поставил меня в тупик. У меня есть простой исполняемый скрипт, который отлично работает на моей машине с Linux ( AWS aka CentOS ), но на моем компьютере Mac OS X произошел сбой. Оказалось, что для экранирования (\) в строковых командах требуется дополнительный escape-символ (\\).

Может ли кто-нибудь рассказать мне о том, чего мне здесь не хватает - то есть, что такое запуск сценариев R на Mac, которые требуют этого?

Поведение было * не *, наблюдаемое при вызове, скажем, python3 -c ..

На обеих машинах я использую bash, в частности /bin/bash

ПРИМЕЧАНИЕ: Mac - немного более поздняя версия R: 3.5.1 против 3.4.1, но я был бы сильно удивлен, если бы это было преступником. Кто-нибудь может подтвердить?


Простой пример:

R --vanilla -e 'cat(" Hello \n World \n ")'

Вышеописанное работает нормально на компьютере с CentOS, но для правильного выполнения требуется дополнительный escape-символ (\\n вместо \n). (пример внизу)

Для справки / сравнения следующая команда python работает одинаково на каждой из компьютеров Mac OS X, CentOS, которые я тестировал.

python3 -c 'print("Hello \n World")'


Для получения подробной информации, вот выходные данные, сравнивающие две команды на каждой из двух машин

1. R --vanilla -e 'cat(" Hello \n World \n ")'
2. R --vanilla -e 'cat(" Hello \\n World \\n ")'
* * 1. тысяча сорок-девять
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

2

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

Для сравнения, я не вижу того же поведения при запуске простого скрипта на python.

## Each of these produce identical 
##  results in Mac OSX as CentOS

python3 -c 'print("Hello \n World")'
python3 -c 'print("Hello \\n World")'


Информация о машине и сеансе:

  1. Linux Box
> 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
  1. Mac OS Box
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
  1. Другая машина Mac OSX, работающая на 3.4.3, та же ошибка
> 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

1 Ответ

4 голосов
/ 19 марта 2019

Вслед за моим предположением, что причиной проблемы может быть разница между macOS sed и GNU sed и предложение Чарльза Даффи в качестве последнего комментария к исходному вопросу, который я пытался назвать Исполняемый файл R непосредственно в macOS Mojave 10.14.3 и R 3.5.3, как указано ниже в сценарии оболочки:

export R_HOME=$(R RHOME)
Rexec=${R_HOME}/bin/exec/R

$Rexec --vanilla -e 'cat(" Hello \n World \n ")'

И это не выдаст сообщений об ошибках и выдаст тот же вывод, что и в Linux.

По моему мнению, проблема не в ошибке в bash, а в печальной разнице между macOS (BSD) и GNU sed. Я понятия не имею, как это можно исправить в сценарии оболочки R, если это возможно.

...