SHELL
[ Process = ] SHELL Command [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Name ]
SHELL Command TO Variable
执行一条命令行,创建一个内部
Process 来管理命令行。
Standard syntax
命令行包含在一个字符串中被传递给系统命令行解释器 (
/bin/sh
) 。
-
如果指定
WAIT
,那么解释器等待命令行结束,否则命令行在后台执行。
-
如果指定
FOR
,那么重定向命令行输入输出,所以程序可以截获它们:
-
如果指定
WRITE
,可以用 Process 的通用输出语句(PRINT、WRITE、...)发送数据到命令行的标准输入。注意,为了能够这样做,需要一个Process的引用。
-
如果指定
READ
,每次命令行发送数据到其标准输出流时将有事件发生:当数据被发送到标准输出流时事件Read事件发生,当数据被送到标准错误输出流时 事件Error事件发生。流与输入/输出功能使用进程对象读取进程标准输出。
-
如果使用
INPUT
和 OUTPUT
关键字替换 READ
和 WRITE
,进程被执行在虚拟终端中。 这意味着进程认为自己运行在真正的终端中。
-
Name
是Process使用的事件名。缺省是“=Process=”。
In Gambas 3, there is no default event name anymore.
In other words, you must add
As "Process"
to get the same behaviour as Gambas 2.
在Gambas3中,它不再是缺省的事件名。
换句话说,必须添加
以得到像Gambas2一样的特性。
用赋值语句可以创建一个对内部
Process的引用。
Quick syntax
如果使用第二种语法执行命令行,解释器等待其结束,并且完整的命令行输出会保存在指定的字符串中。
Examples
' 获取目录的内容
SHELL "ls -la /tmp" WAIT
' 在后台完成同样的工作
DIM Content AS String
SHELL "ls -la /tmp" FOR READ
' Get the contents of a directory in background
Dim Result AS String
Shell "ls -la /tmp" For Read As "Process"
...
PUBLIC SUB Process_Read()
DIM sLine AS String
READ #LAST, sLine, -256
Content = Content & sLine
PRINT sLine;
END
使用
Lof函数可以获知在=Process_Read=事件处理中能读取多少字节。
作为发送给命令行解释器的参数,不得不引证它们,就像在命令行上直接键入一样。
SHELL "perl -e 'print while <>;'" FOR READ WRITE
或者可以使用
Quote.Shell方法来创建一个命令行解释器不进行修改的引证字符串。
与VB的Shell命令的返回进程ID和依赖程序员使用API调用来控制进程不同,GambasShell函数选择返回一个能直接杀死产生的进程或者进行其它控制的
Process(如果被赋值给声明为
Process类型的变量)。另外与VB形成对照的是进程可以同步或者异步运行。
参见