2016-05-08 6 views
0

Supposedlyjjs - это версия 8-го Java нашорна, ready for shell-scripting. Однако, когда я пишу файл с правами на выполнение как:Написание сценария jjs` shebanged, который принимает только аргументы

#!/usr/bin/jjs 
arguments.forEach(function(v,i,a){print(v);}); 

Забегая производит некоторые не столь идеального поведения оболочки сценариев:

$./file.js 
$./file.js one two 
java.io.IOException: one is not a file 
$./file.js -- one two 
one 
two 
$./file.js file.js -- one two # what were they thinking 
one 
two 
one 
two 
$ 

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

#!/usr/bin/jjs -- 
arguments.forEach(function(v,i,a){print(v);}); 

Но это становится менее полезно:

$./file.js 
jjs>^D 
$./file.js one two 
jjs>^D 
$./file.js -- one two 
jjs> 

Да, при падении в REPL строке именно то, что я думал, что должен не случиться.

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

$./file.js one two 
one 
two 
$ 
+0

Я могу» t найти, где они cla im, он может использоваться как сценарий оболочки? Однако в документах упоминается jrunscript. – RobAu

+1

@RobAu Я предполагаю, что я не связывал сообщение в блоге, которое я прочитал, который утверждал это, и может быть неясно, что 'jjs' является дополнением к' jrunscript', который имеет расширения при использовании флага '-scripting', позволяющего' $ ARG', '$ ENV', heredocs, backticks и еще несколько сценариев. – dlamblin

ответ

2

На примере работ, как ожидается, в JDK 9 версия Nashorn. Я позабочусь о том, чтобы выполнить резервное копирование необходимых патчей, чтобы они могли появиться в одном из будущих выпусков 8u.

Обновление: Необходимые изменения переданы в поток 8u, но не ясно, в какой момент будет выпуск. Ранние версии доступа JDK 9, доступные от https://jdk9.java.net/download/, имеют функцию shebang, а также другие расширения, такие как поддержка трубопроводов для встроенного $ EXEC.

+0

Вы будете? Это было бы здорово! Спасибо. Не стесняйтесь обновлять этот пост любой ссылкой на ошибку, отслеживающую это или как бы там ни было правильный запрос. Полагаю, вы имеете в виду, что в JDK 9 одна из двух версий 'file.js', показанная мной, проявлялась как в последнем блоке моего вопроса, подобном поведению. Если да, то это тот, у которого есть или нет '-' в shebang? – dlamblin

+0

Сообщение обновлено. '' '' '' Не нужно упоминать в строке shebang, чтобы ваш пример работал. – haupz

1

Ожидая, что изменения будут сохранены, я написал сценарий для решения проблемы. Мой jvm установлен в папке /usr/lib/jvm/jdk1.8.0_101, поэтому я создал следующий скрипт:

/usr/lib/jvm/jdk1.8.0_101/bin/jjs/bin/jjs- cp.sh:

#!/bin/bash 
CP= 
if [[ $1 = "--lib="* ]]; then 
    LIB_FOLDERS=${1:6} 
    shift 

    LIB_FOLDERS=$(echo $LIB_FOLDERS | tr ":" "\n") 
    for FOLDER in $LIB_FOLDERS; do 
     if [[ $FOLDER = "!"* ]]; then 
      CP="$CP:${FOLDER:1}" 
     else 
      if [ -d $FOLDER ]; then 
       JARS=$(find "$FOLDER" -type l -o -type f -name "*.jar") 
       for JAR in $JARS; do 
        CP="$CP:$JAR" 
       done 
      fi 
     fi 
    done 
    if [ -n $CP ]; then 
     CP=${CP:1} 
    fi 
fi 
SCRIPT_FILE="$1" 
shift 
if [ -n $CP ]; then 
    /usr/lib/jvm/jdk1.8.0_101/bin/jjs -cp "$CP" $SCRIPT_FILE -- [email protected] 
else 
    /usr/lib/jvm/jdk1.8.0_101/bin/jjs $SCRIPT_FILE -- [email protected] 
fi 

Тогда в моем test.js сценарии я могу написать:

#!/usr/lib/jvm/jdk1.8.0_101/bin/jjs-cp.sh --lib=!.:<full path to classpath folder 1>:<full path to classpath folder 2> 
var console = { 
    log: function(msg) { 
     java.lang.System.out.println(msg); 
    } 
}; 

console.log('Hello, world!'); 
arguments.forEach(console.log); 

var MyClass = Java.type('com.acme.MyClass'); // load a class from a jar in the classpath 
console.log(MyClass.class); // prints "class com.acme.MyClass" 

И я могу исполнить мой сценарий с этой командной строки:

~$ ./test.js one two