#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, если вы заключаете строку в обратные галочки).