Проблема с пробелами Java 8 Nashorn

#javascript #java-8 #nashorn

#javascript #java-8 #nashorn

Вопрос:

Обновить:

У меня есть грубое решение, которое работает, но оно мне не нравится:

jjs> NANO_HOME = ‘»/Users/XXXXXX/Desktop/TEST DIR»‘; jjs> $EXEC(‘xargs ls’, «${NANO_HOME}»);


Я использую Java 8 Nashorn для выполнения некоторых сценариев оболочки, и у меня возникают проблемы со списком файлов в каталоге, если имя каталога содержит пробел:

 $ jjs -scripting
jjs> `ls /Users/XXXXXX/Desktop/`
TEST DIR
jjs> `ls /Users/XXXXXX/Desktop/TEST DIR`

jjs> $ERR
ls: /Users/XXXXXX/Desktop/TEST: No such file or directory
ls: DIR: No such file or directory  

jjs> `ls "/Users/XXXXXX/Desktop/TEST DIR"`

jjs> $ERR
ls: "/Users/XXXXXX/Desktop/TEST: No such file or directory
ls: DIR": No such file or directory

jjs> `ls /Users/XXXXXX/Desktop/TESTu0020DIR`

jjs> $ERR
ls: /Users/XXXXXX/Desktop/TEST: No such file or directory
ls: DIR: No such file or directory

jjs> `ls /Users/XXXXXX/Desktop/TEST DIR`

jjs> $ERR
ls: /Users/XXXXXX/Desktop/TEST: No such file or directory
ls: DIR: No such file or directory
  

Я перепробовал десятки вариантов, и ничего не работает…

Комментарии:

1. Вы пробовали заключать всю строку в кавычки? Дважды экранированный пробел ( \ )?

2. да, у меня есть, к сожалению, это не сработало.

3. Примечание: обратные кавычки действительно должны быть там; так jjs работает.

Ответ №1:

К сожалению, похоже, что синтаксис обратной кавычки для вызова системных команд (а также $EXEC функция, которая делает то же самое) неправильно обрабатывает аргументы, содержащие пробелы.

Исходный код находится в exec функции в ScriptingFunctions.java файл. К сожалению, для разделения строки на массив строк аргументов, которые затем передаются в StringTokenizer , используется обычный ProcessBuilder код. Это означает, что пробелы, кавычки, обратная косая черта и так далее не принимаются во внимание.

Я бы сказал, что это ошибка. Должен быть способ передать массив аргументов непосредственно в $EXEC вместо того, чтобы он разбирал строку на аргументы, но я не знаю ни одного.

Обновить

Отправлен запрос на улучшение JDK-8049300.

Ответ №2:

Попробуйте

 ls "/Users/XXXXX/Desktop/TEST DIR"
  

Это работает для вас? (Это происходит в Windows, если вы заключаете строку в обратные галочки).