jrunscript as a cross platform scripting environment
- by user12798506
?????????????????????????????????????????????????????????sh????????????UNIX???????????????????sh???????????????????????????????????????????Windows?????????????????
sh??????????????find?grep?sed?awk???Windows??????????????????????????????????????????????????????????????????????????????????????????????Windows???Cygwin????????????sh??????Windows??????????????Cygwin????????????????????????????????????????????JDK?????jrunscript?????JavaScript???????????????????????1?????????jrunscript???????????????????
Windows???UNIX???????????????????????
find?grep?sed?awk?????????sh???????????????Windows Script Host???????
Java?????????????
??????????????????????????????????????????????????????????(?????????????????????????????????????????)
?????????????JDK 6??????????????????????????PC????????????????JDK 6?PC????????????????????????????????????JDK????????????????????????????????????????jrunscript??????????????????????????
?????jrunscript????JavaScript??????????????????????????????????????????
1) Windows???UNIX?????????????????
?????????????????????????????????????????JavaScript???mytool.js???????????????????????jrunscript???????????UNIX????sh???????Windows????bat?????????????????????
mytool.sh (UNIX?):
#!/bin/sh
bindir=$(cd $(dirname $0) && pwd)
case "`uname`" in
  CYGWIN*) bindir=`cygpath -w "$bindir"`
           ;;
esac
jrunscript "${bindir}/mytool.js" $*
mytool.bat (Windows?):
@echo off
set bindir=%~dp0
jrunscript "%bindir%mytool.js" %*
UNIX??sh????????Cygwin???????????????????????????????????????????js??????????????UNIX?Windows???????????????????????????????
2) jrunscript??cat, cp, find?grep??????
jrunscript???UNIX??????????????????????????????????
jrunscript JavaScript built-in functions
????UNIX??sh?????????????????????UNIX?????????????????????????????????????????src??????????java????????????enum???????java??????????????????????????????????????????????
find('src', '.*.java', function(f) { grep('enum', f); });
???????UNIX?????????????????????????????????????????????????????????????????????????????????????????cp(from, to)??????????????????????????????????????????UNIX???????????
$ cp -r src/* tmp/
?????????????????????????????????????????find()???????cp -r????????·??????????????????????
function cpr(fromdir, todir, pattern) {
    if (pattern == undefined) {
        pattern = ".*";
    }
    var frdir = pathToFile(fromdir).getCanonicalPath();
    find(fromdir, pattern, function(f) {
        // relative dir of file f from 'fromdir'.
        var relative = f.getParentFile().getCanonicalPath().substring(frdir.length() + 1);
        var dstdir = pathToFile(todir + "/" + relative);
        if (!dstdir.exists()) {
            // Create the destination dir for file f.
            mkdirs(dstdir);
        }
        // Copy file f to 'dstdir'.
        cp(f, dstdir + "/" + f.getName());
    });
}
java?????I/O?API??Windows?????????????"/"??????????????????????????????UNIX?Windows??????????????
????????????exec(cmd)?????????jar????????????????????????????????????????????
$ jrunscript
js> exec("jar xvf example.jar")
  META-INF/ ?????????????µ???B
 META-INF/MANIFEST.MF ???W?J???????µ???B
  com/ ?????????????µ???B
  com/example/ ?????????????µ???B
 com/example/Bar.class ???W?J???????µ???B
  com/example/dummy/ ?????????????µ???B
com/example/dummy/dummy.txt ?????o???????µ???B
com/example/dummy.properties ?????o???????µ???B
 com/example/Foo.class ???W?J???????µ???B
???exec()?????????????????????????????????????????????????????????????????Windows????????????I/O??????????????????????????????????BAT?????????
errmsg.bat:
for /L %%i in (1,1,50) do echo "Error Message count = %%i" 1&2
jrunscript??exec()???????????????18???????????????????????????????????
C:\tmp>jrunscript -e "exec('errmsg.bat')"
C:\tmp>for /L %i in (1 1 100) do echo "Error Message count = %i"  1>&2
C:\tmp>echo "Error Message count = 1"  1>&2
        :
C:\tmp>echo "Error Message count = 18"  1>&2   ? ???
???????????exec()?????????????????????????????????????????????????????????????????DataInputStream????????????????????????
$ jrunscript
js this["exec"].toString()
function exec(cmd) {
    var process = java.lang.Runtime.getRuntime().exec(cmd);
    var inp = new DataInputStream(process.getInputStream());
    var line = null;
    while ((line = inp.readLine()) != null) {
        println(line);
    }
    process.waitFor();
    $exit = process.exitValue();
}
?????????????????????????????????????????????????????exec()???????????????exec()?????????????????????????????exec()???????
function exec(cmd) {
    var process = java.lang.Runtime.getRuntime().exec(cmd);
    var stdworker = new java.lang.Runnable(
        {run: function() { cat(process.getInputStream()); }});
    var errworker = new java.lang.Runnable(
        {run: function() { cat(process.getErrorStream()); }});
    new java.lang.Thread(stdworker).start();
    new java.lang.Thread(errworker).start();
    return proc.waitFor();
}
???????????????????cat()???????????cat()?InputStreamReader??????????????????????????????????????????????????
3) JavaScript????????????????
JavaScript?Java???????????????????????JavaScript????????????Ruby?Groovy?Scala???????????????????????????????????????????????10MB?????????????????????????????????????JavaScript????????????????????KB?????????????MB?JAR??????????????????????????JRE?JDK?????????????????????????????????????????