EXEC
[
Process = ]
EXEC Command [
WAIT ] [
FOR { {
READ |
INPUT } | {
WRITE |
OUTPUT } } ] [
AS Name ]
EXEC Command TO Variable [
WITH ERROR ]
通过运行子进程来执行命令。
将创建一个内部
Process 对象来管理该命令。
标准语法
传递给EXEC的
Command 必须指定为逗号分隔的字符串常量列表或数组。列表/数组中的第一个元素是命令的名称,其他元素是命令参数(如果有)。
-
如果指定
WAIT
,那么解释器等待命令行结束,否则命令行在后台执行。
-
如果指定
FOR
,那么重定向命令行输入输出,所以程序可以截获它们:
-
如果指定
WRITE
,可以用Process的通用输出语句(PRINT、WRITE、...)发送数据到命令行的标准输入。注意,为了能够这样做,需要一个Process的引用。
-
如果指定
READ
,每次命令行发送数据到其标准输出流时将有事件发生:当数据被发送到标准输出流时Read发生,当数据被送到标准错误输出流时 Error发生。使用带流与输入/输出功能的进程对象读取进程标准输出。
-
如果使用
INPUT
和 OUTPUT
关键字替换 READ
和 WRITE
,进程被执行在虚拟终端中。 这意味着进程认为自己运行在真正的终端中。
-
Name
是Process使用的事件名。缺省是 "Process"
。
用赋值语句可以创建一个对内部
Process 对象的引用。
程序搜索
命令可以指定为绝对路径,也可以指定为程序名。
如果将命令指定为程序名,则会通过
PATH
环境变量搜索该程序。
该功能很方便,但会减慢启动时间。
自从 3.6
您可以使用
System.Find方法
通过
PATH
环境变量搜索程序。
然后你可以将返回的绝对路径存储在变量中,稍后将其与EXEC一起使用以启动程序,而不必重复搜索过程。
快捷语法
如果使用第二种语法执行命令行,
EXEC Command TO Variable
解释器等待其结束,并且完整的命令行输出会保存在指定的字符串中。
在执行命令期间,您无法控制正在执行的进程。
仅获取进程的标准输出。错误输出不会重定向。
自从 3.17
从 Gambas 3.17开始, 可以通过使用以下语法将标准输出和错误输出重定向到字符串。
EXEC Command TO Variable WITH ERROR
环境变量
您可以在命令参数后面使用
WITH关键字为正在运行的进程指定新的环境变量:
[ Process = ] EXEC Command WITH Environment ...
Environment 是一个字符串数组,每个字符串的格式如下:
"NAME=VALUE"
。
NAME
是环境变量的名称,
VALUE
是它的值。
如果要删除环境变量,只需使用字符串
"NAME="
。
在虚拟终端内运行
如果进程在虚拟终端中运行,即如果使用
FOR INPUT /
OUTPUT 语法,则可以将控制字符发送到进程标准输入,以获得与在真实终端中输入相同的效果。
^C
停止进程,
^Z
暂停进程,依此类推。
虚拟终端只有一个输出。因此,正在运行的进程的标准错误输出可通过 Read
事件接收。
有些程序有一个命令行界面,只有在虚拟终端内运行时才能访问。
If you plan to control an application by sending commands to standard input then testing should be performed outside of the IDE (i.e. make an executable and launch it from the command line) as the console within the development environment is not a true virtual terminal and will cause unexpected results.
自Gambas 3.9以来,IDE控制台现在是一个真正的终端模拟器。
示例
' 获取目录的内容
EXEC [ "ls", "-la", "/tmp" ] WAIT
' 获取目录的内容存入一个字符串
DIM sOutput AS String
EXEC [ "ls", "-la", "/tmp" ] TO sOutput
Print sOutput
' How to give a value to an option: Print contents of /tmp directory, except gambas temporary
' directories, using the --hide option to ls.
' Either use = to separate the long option from the value and put both into one array member
Exec ["ls", "-l", "--hide=*gambas*", "/tmp"] Wait
' Or use a new array member. This must be used with short options.
Exec ["ls", "-l", "--hide", "*gambas*", "/tmp"] Wait
' 后台获取目录的内容存入一个字符串
DIM sOutput AS String
' 使用指定的事件名
EXEC [ "ls", "-la", "/tmp" ] FOR READ AS "Contents"
...
PUBLIC SUB Contents_Read()
DIM sLine AS String
READ #LAST, sLine, -256
sOutput &= sLine
END
PUBLIC SUB Contents_Kill()
PRINT sOutput
END
使用
Lof函数可以获知在
Process_Read
事件处理中能读取多少字节。
作为直接发送到进程的参数,不必引证它们,就像在命令行解释器中必须做的那样。
' perl -e 'print while <>;' becomes
EXEC [ "perl", "-e", "print while <>;" ] FOR READ WRITE
参见