Relates :
|
The $EXEC and `command` facilities of Nashorn scripting unconditionally break the string into words using StringTokenizer. There is no way to protect spaces from causing word breaks; there needs to be. The usual way to do this is to provide an alternative form of executing a command that takes an array of strings and passes it directly to ProcessBuilder, instead of tokenizing a single string into an array before passing it to ProcessBuilder. In addition, the tokenizing behavior is overly simplistic. It would also be nice to have another command that passes a single string as the argument to sh -c. (Where "sh" would be replaced by the value of the SHELL environment variable.) This would allow for proper shell-style quoting and redirection. ===== CURRENT BEHAVIOR ===== sh-3.2$ ls sh-3.2$ touch a 'b c' sh-3.2$ ls -l total 0 -rw-rw-r--+ 1 smarks smarks 0 Jul 3 14:59 a -rw-rw-r--+ 1 smarks smarks 0 Jul 3 14:59 b c sh-3.2$ jjs -scripting jjs> $EXEC("ls -l") total 0 -rw-rw-r--+ 1 smarks smarks 0 Jul 3 14:59 a -rw-rw-r--+ 1 smarks smarks 0 Jul 3 14:59 b c jjs> $EXEC("ls -l a") -rw-rw-r--+ 1 smarks smarks 0 Jul 3 14:59 a jjs> $EXEC("ls -l 'b c'") jjs> $ERR ls: 'b: No such file or directory ls: c': No such file or directory jjs> $EXEC("ls -l b\ c") jjs> $ERR ls: b: No such file or directory ls: c: No such file or directory ===== DESIRED BEHAVIOR ===== jjs> $EXECV("ls", "-l", "a", "b c") -rw-rw-r--+ 1 smarks smarks 0 Jul 3 14:59 a -rw-rw-r--+ 1 smarks smarks 0 Jul 3 14:59 b c jjs> $RUN("ls -l a 'b c' | wc") 2 19 96 ===== It doesn't have to be exactly the above, of course. Some means will need to be provided for passing data to stdin much like $EXEC does today.