Как передать line.separator в JVM через переменную bash JAVA_OPTS без интерполяции; Является ли это возможным?

Я надеюсь решить проблему (описанную ниже) при установке переменной среды JAVA_OPTS, которая является стандартным способом Java (и Scala) для передачи системных свойств в JVM. Я хочу установить line.separator на одну новую строку в Windows (это по умолчанию уже одна новая строка везде).

Кстати, какое-то программное обеспечение (например, sbt) прекратит эту настройку, но, тем не менее, все еще полезно.

Этот скрипт scala используется для отображения эффективного свойства line.separator:

#!/usr/bin/env scala
val bytes = sys.props("line.separator").map { _.toInt }.mkString(" ")
printf("line.separator bytes: %s\n",bytes)

В системе Windows это обычно печатает следующее:

line.separator bytes: 13 10

Это делает именно то, что я хочу со следующей настройкой JAVA_OPTS:

export JAVA_OPTS=-Dline.separator=$'\n'

но только если я также изменю стандартный скрипт scala, окружив $JAVA_OPTS двойными кавычками. Вот раздел ближе к концу дословного сценария Scala (т. Е. БЕЗ необходимой модификации):

execCommand \
  "${JAVACMD:=java}" \
  $JAVA_OPTS \
  "${java_args[@]}" \
  "${classpath_args[@]}" \
  -Dscala.home="$SCALA_HOME" \
  $OVERRIDE_USEJAVACP \
  $WINDOWS_OPT \
   scala.tools.nsc.MainGenericRunner  "$@"

С этими двумя модификациями тестовый скрипт выше печатает следующее:

$ reportLineSeparator.sc
line.separator bytes: 10

Однако добавление кавычек в JAVA_OPTS не является жизнеспособным вариантом, поскольку это предотвратит его сброс или задание нескольких настроек.

Таким образом, кажется, что требуется как-то организовать правильную обработку без кавычек JAVA_OPTS без потери закодированного перевода строки.

Я начинаю подозревать, что есть решение, хотя я надеюсь, что кто-то докажет, что я неправ.

Обновление: кажется, что если вместо JAVA_OPTS используется массив bash, это обеспечит решение, поскольку его можно заключить в скрипт scala. Другими словами, замените без кавычек $JAVA_OPTS выше на это:

"${JAVA_OPTS_ARR[@]}" \

Я был приятно удивлен, что это также не вызывает проблем, когда JAVA_OPTS_ARR не определен.

Однако это не является жизнеспособным решением, поскольку невозможно экспортировать массивы bash (см. Экспорт массива в сценарии bash).

Продолжение: после дальнейшего размышления об этой проблеме я пришел к выводу, что интерполяция не является проблемой. Кавычки необходимы, чтобы содержать переменную в качестве единственного аргумента командной строки. Таким образом, возникает вопрос о том, можно ли использовать Внутренний разделитель полей (IFS), чтобы сохранить все определение line.separator как один аргумент командной строки без кавычек.

Хорошо, кажется, что если я добавлю следующее в скрипт запуска scala, настройка line.separator, похоже, вступит в силу:

IFS=' '

Затем я могу добавить к JAVA_OPTS, как это и получить желаемое поведение:

JAVA_OPTS="$JAVA_OPTS "-Dline.separator=$'\n'

Параметр IFS должен произойти до того, как произойдет без кавычек $JAVA_OPTS.

1 ответ

JAVA_OPTS это древнее соглашение, но не стандарт. Он был введен в scala сценарий в 2007 году и настиг -J в 2010.

Я думаю, что лучший вариант (так сказать) scala -J-Dline.separator=$'\r'$'\n',

Теперь для вашего предложения есть пиар, который кажется безопасным, за исключением того, что он также сохраняет вкладку для случая:

JAVA_OPTS="-Xmx256m <tab> -Xss1m",

Цитаты из ракушек - это так весело! Я стараюсь обновлять свою шрамовую память каждые пять лет или около того.

Другие вопросы по тегам