24 種語言執(zhí)行外部命令的方法
45 2017-04-14
南寧達內:24種語言執(zhí)行外部命令的方法
在這個例子中展示用不同語言調用外部命令的方法。覺得這個挺有意思,轉來給大家看看,也許某一天你會覺得有用。
這些語言包括
Ada
AppleScript
C
C++
C#
E
Forth
Haskell
IDL
J
Java
Logo
MAXScript
Objective-C
OCaml
Perl
PHP
Pop11
Python
Raven
Ruby
Tcl
Toka
UNIXShell
原文在
Ada
01withInterfaces.C;useInterfaces.C;
02
03
04procedureExecute_Systemis
05
06functionSys(Arg:Char_Array)returnInteger;
07
08pragmaImport(C,Sys,"system");
09
10Ret_Val:Integer;
11
12begin
13
14Ret_Val:=Sys(To_C("ls"));
15
16endExecute_System;
AppleScript
1doshellscript"ls"withoutalteringlineendings
C
支持版本gccversion4.0.1
平臺:BSD
1#include
2
3intmain()
4{
5system("ls");
6}
C++
支持版本:VisualC++version2005
1system("pause");
C#
支持版本:MCSversion1.2.3.1
01usingSystem;
02
03classExecute{
04staticvoidMain(){
05System.Diagnostics.Processproc=newSystem.Diagnostics.Process();
06proc.EnableRaisingEvents=false;
07proc.StartInfo.FileName="ls";
08proc.Start();
09}
10
11}
E
01defls:=makeCommand("ls")
02
03ls("-l")
04
05
06
07def[results,_,_]:=ls.exec(["-l"])
08
09when(results)->{
10
11def[exitCode,out,err]:=results
12
13print(out)
14
15}catchproblem{
16
17print(`failedtoexecutels:$problem`)
18
19}
Forth
支持版本:gforthversion0.6.2
1s"ls"system
Haskell
支持版本:GHCiversion6.6
1importSystem.Cmd
2
3main=system"ls"
IDL
帶屏幕輸出的"ls":
$ls
將輸出保存到數(shù)組"result":
spawn,"ls",result
異步執(zhí)行,將輸出轉到LUN"unit",以便在以后讀取:
spawn,"ls",unit=unit
J
J語言系統(tǒng)命令界面由標準的"task"腳本提供:
load’task’
NB.Executeamandandwaitforittoplete
shell‘dir’
NB.Executeamandbutdon’twaitforittoplete
fork‘notepad’
NB.Executeamandandcaptureitsstdout
stdout=:shell‘dir’
NB.Executeamand,provideitwithstdin,
NB.andcaptureitsstdout
stdin=:‘blahblahblah’
stdout=:stdinspawn‘grepblah’
Java
支持版本:Javaversion1.4+
有兩種執(zhí)行系統(tǒng)命令的方法,簡單的方法會掛起JVM
01importjava.io.IOException;
02importjava.io.InputStream;
03
04publicclassMainEntry{
05
06publicstaticvoidmain(String[]args){
07executeCmd("ls-oa");
08}
09
10privatestaticvoidexecuteCmd(Stringstring){
11
12InputStreampipedOut=null;
13
14try{
15ProcessaProcess=Runtime.getRuntime().exec(string);
16
17aProcess.waitFor();
18pipedOut=aProcess.getInputStream();
19bytebuffer[]=newbyte[2048];
20intread=pipedOut.read(buffer);
21
22//Replacefollowingcodewithyourintendsprocessingtools
23while(read>=0){
24System.out.write(buffer,0,read);
25read=pipedOut.read(buffer);
26}
27}catch(IOExceptione){
28e.printStackTrace();
29}catch(InterruptedExceptionie){
30ie.printStackTrace();
31}finally{
32if(pipedOut!=null){
33try{
34pipedOut.close();
35}catch(IOExceptione){
36}
37}
38}
39}
40}
正確的方法使用進程提供的線程去讀取InputStream。
001importjava.io.IOException;
002
003importjava.io.InputStream;
004
005
006
007publicclassMainEntry{
008
009publicstaticvoidmain(String[]args){
010
011//themandtoexecute
012
013executeCmd("ls-oa");
014
015}
016
017
018
019privatestaticvoidexecuteCmd(Stringstring){
020
021InputStreampipedOut=null;
022
023try{
024
025ProcessaProcess=Runtime.getRuntime().exec(string);
026
027
028
029//Thesetwothreadshallstopbythemselfwhentheprocessend
030
031ThreadpipeThread=newThread(newStreamGobber(aProcess.getInputStream()));
032
033ThreaderrorThread=newThread(newStreamGobber(aProcess.getErrorStream()));
034
035
036
037pipeThread.start();
038
039errorThread.start();
040
041
042
043aProcess.waitFor();
044
045}catch(IOExceptione){
046
047e.printStackTrace();
048
049}catch(InterruptedExceptionie){
050
051ie.printStackTrace();
052
053}
054
055}
056
057}
058
059
060
061
062
063classStreamGobberimplementsRunnable{
064
065
066
067privateInputStreamPipe;
068
069
070
071publicStreamGobber(InputStreampipe){
072
073if(pipe==null){
074
075thrownewNullPointerException("badpipe");
076
077}
078
079Pipe=pipe;
080
081}
082
083
084
085publicvoidrun(){
086
087try{
088
089bytebuffer[]=newbyte[2048];
090
091
092
093intread=Pipe.read(buffer);
094
095while(read>=0){
096
097System.out.write(buffer,0,read);
098
099
100
101read=Pipe.read(buffer);
102
103}
104
105}catch(IOExceptione){
106
107e.printStackTrace();
108
109}finally{
110
111if(Pipe!=null){
112
113try{
114
115Pipe.close();
116
117}catch(IOExceptione){
118
119}
120
121}
122
123}
124
125}
126
127}
Logo
支持版本:UCBLogo
SHELL命令返回列表:
1printfirstbutfirstshell[ls-a];..
MAXScript
dosCommand"pause"
Objective-C
支持版本:蘋果公司的GCCversion4.0.1
1voidrunls()
2{
3[[NSTasklaunchedTaskWithLaunchPath:@"/bin/ls"
4arguments:[NSArrayarray]]waitUntilExit];
5}
如果你希望調用系統(tǒng)命令,先執(zhí)行shell:
1voidrunSystemCommand(NSString*cmd)
2{
3[[NSTasklaunchedTaskWithLaunchPath:@"/bin/sh"
4arguments:[NSArrayarrayWithObjects:@"-c",cmd,nil]]
5waitUntilExit];
6}
同樣可以使用上面的C語言調用方法。
OCaml
Sysmand"ls"
Perl
01my@result=qx(ls);
02#runsmandandreturnsitsSTDOUT
03
04my@results=`ls`;
05#dito,alternativesyntax
06
07system"ls";
08#runsmandandreturnsitsexitstatus
09
10print`ls`;
11#Thesame,butwithbackquotes
12
13exec"ls";
14#replacecurrentprocesswithanother
另外可以參閱
PHP
首行執(zhí)行命令,第二行顯示輸出:
1@exec(mand,$output);
2
3echonl2br($output);
注意這里的‘@’防止錯誤消息的顯示,‘nl2br’將‘\n’轉換為HTML的‘br’
Pop11
sysobey(’ls’);
Python
支持版本:Pythonversion2.5
1importos
2code=os.system(’ls’)#Justexecutethemand,returnasuccess/failcode
3output=os.popen(’ls’).read()#Ifyouwanttogettheoutputdata
或者
支持版本:Pythonversion2.4(及以上版本)
1importsubprocess
2output=subprocess.Popen(’ls’,shell=True,stdout=subprocess.PIPE).stdout
3printoutput.read()
后者是比較好的方法。
或者
支持版本:Pythonversion2.2(及以上版本)
1importmands
2stat,out=mands.getstatusoutput(’ls’)
3ifnotstat:
4printout
Raven
`ls-la`aslisting
或者指定任何字符串
‘ls-la’shellaslisting
Ruby
string=`ls`
Tcl
puts[execls]
同樣可以使用系統(tǒng)open命令。
setio[open"|ls"r]
獲取結果的方法是
setnextline[gets$io]
或者
setlsoutput[read$io]
如果命令是以RW方式打開,可以用同樣的方法發(fā)送用戶的輸入。
Toka
needsshell
"ls"system
UNIXShell
直接調用
ls
如果希望獲取標準輸出
CAPTUREDOUTPUT=$(ls)
在C-Shell中可以這樣做
setMYCMDOUTPUT=`ls`
echo$MYCMDOUTPUT
在KornShell中是這樣:
MYCMDOUTPUT=`ls`
echo$MYCMDOUTPUT
掃一掃
獲取更多福利
獵學網(wǎng)企業(yè)微信
獵學網(wǎng)訂閱號
獵學網(wǎng)服務號