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?????????????????????????????????????????