Как передать 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"
,
Цитаты из ракушек - это так весело! Я стараюсь обновлять свою шрамовую память каждые пять лет или около того.