Gambas文档
编译和安装
错误消息
代码片段
翻译
废弃的组件
教程
开发环境文档
开发文档
名词解释
如何操作
说明
维基手册
维基搜索
维基许可协议
文档
应用程序仓库
语言概览
语言索引
#Else
#Endif
#If
+INF
-INF
Abs
Access
ACos
ACosh
Alloc
AND
AND IF
Ang
APPEND
AS
Asc
ASin
ASinh
Asl
Asr
ASSERT
ATan
ATan2
ATanh
Base$
Base64$
BChg
BClr
BEGINS
Bin$
Boolean@
BREAK
BSet
BTst
BYREF
Byte@
CASE
CATCH
CBool
Cbr
CByte
CDate
Ceil
CFloat
CHGRP
CHMOD
Choose
CHOWN
Chr$
CInt
CLASS
CLong
CLOSE
Comp
CONST
CONTINUE
Conv$
COPY
Cos
Cosh
CPointer
CREATE
CREATE PRIVATE
CREATE STATIC
CShort
CSingle
CStr
CString
CVariant
Date
Date@
DateAdd
DateDiff
Day
DConv$
DEBUG
DEC
Dec
DEFAULT
Deg
DFree
DIM
Dir
DIV
DO
DOWNTO
EACH
ELSE
END
ENDIF
ENDS
END SELECT
END STRUCT
END WITH
ENUM
Eof
ERROR
ERROR TO
Eval
Even
EVENT
EXEC
Exist
Exp
Exp2
Exp10
Expm
EXPORT
EXTERN
FALSE
FAST
FAST UNSAFE
FINALLY
Fix
Float@
Floor
FLUSH
FOR
FOR EACH
Format$
Frac
Free
FromBase
FromBase64$
FromUrl$
FUNCTION
GOSUB
GOTO
Hex$
Hour
Html$
Hyp
IF
IIf
IN
INC
INCLUDE or #INCLUDE
INHERITS
INPUT
INPUT FROM
InStr
Int
Int@
Integer@
IS
IsAlnum
IsAscii
IsBlank
IsBoolean
IsDate
IsDigit
IsDir
IsFloat
IsHexa
IsInf
IsInteger
IsLCase
IsLetter
IsLong
IsLower
IsMissing
IsNaN
IsNull
IsNumber
IsPunct
IsSpace
IsUCase
IsUpper
KILL
LAST
LCase$
Left$
Len
LET
LIBRARY
LIKE
LINE INPUT
LINK
LOCK
Lof
Log
Log2
Log10
Logp
Long@
LOOP
Lsl
Lsr
LTrim$
Mag
MATCH
Max
ME
Mid$
Min
Minute
MkBool$
MkBoolean$
MkByte$
MkDate$
MKDIR
MkFloat$
MkInt$
MkInteger$
MkLong$
MkPointer$
MkShort$
MkSingle$
MOD
Month
MOVE
NEW
NEXT
NOT
Now
NULL
Oct$
Odd
ON GOSUB
ON GOTO
OPEN
OPEN MEMORY
OPEN MEMORY
OPEN NULL
OPEN PIPE
OPEN PIPE
OPEN STRING
OPTIONAL
OR
OR IF
OUTPUT
OUTPUT TO
PEEK
Pi
Pointer@
PRINT
PRIVATE
PROCEDURE
PROPERTY
PUBLIC
QUIT
Quote$
Rad
RAISE
Rand
RANDOMIZE
RDir
READ
Realloc
REPEAT
Replace$
RETURN
Right$
RInStr
RMDIR
Rnd
Rol
Ror
Round
RTrim$
Scan
SConv$
Second
SEEK
Seek
SELECT
Sgn
SHELL
Shell$
Shl
Short@
Shr
Sin
Single@
Sinh
SizeOf
SLEEP
Space$
Split
Sqr
Stat
STATIC
STEP
STOP
STOP EVENT
Str$
Str@
String$
String@
StrPtr
STRUCT
SUB
Subst$
SUPER
SWAP
Tan
Tanh
Temp$
THEN
Time
Timer
TO
Tr$
Trim$
TRUE
TRY
TypeOf
UCase$
UnBase64$
UNLOCK
Unquote$
UNTIL
Url$
USE
Val
VarPtr
WAIT
WATCH
Week
WeekDay
WEND
WHILE
WITH
WRITE
XOR
Year
本地化和翻译函数
变量声明
常量表达式
常量声明
方法声明
复数
赋值
赋值操作
行标号
结构体声明
局部变量声明
逻辑运算
枚举声明
内置集合
内置数组
使用保留字作为标识符
事件声明
事件循环
属性声明
数据类型
数据类型的二进制表示形式
数组声明
算术运算
外部函数管理
外部函数声明
语言常量
运算符优先级
专用方法
字符串操作
主题
组件
最近的修改

EXEC

[ Process = ] EXEC Command [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Name ]

EXEC Command TO Variable [ WITH ERROR ]

通过运行子进程来执行命令。

将创建一个内部Process 对象来管理该命令。

标准语法

传递给EXEC的 Command 必须指定为逗号分隔的字符串常量列表或数组。列表/数组中的第一个元素是命令的名称,其他元素是命令参数(如果有)。

  • 如果指定 WAIT ,那么解释器等待命令行结束,否则命令行在后台执行。

    请不要忘记WAIT关键字,除非要链式执行命令,否则第二个命令将在第一个命令完成之前开始!

  • 如果指定 FOR ,那么重定向命令行输入输出,所以程序可以截获它们:

    • 如果指定 WRITE ,可以用Process的通用输出语句(PRINTWRITE、...)发送数据到命令行的标准输入。注意,为了能够这样做,需要一个Process的引用。

    • 如果指定 READ ,每次命令行发送数据到其标准输出流时将有事件发生:当数据被发送到标准输出流时Read发生,当数据被送到标准错误输出流时 Error发生。使用带流与输入/输出功能的进程对象读取进程标准输出。

    • 如果使用 INPUTOUTPUT 关键字替换 READWRITE ,进程被执行在虚拟终端中。 这意味着进程认为自己运行在真正的终端中。

  • NameProcess使用的事件名。缺省是 "Process"

    在Gambas3中,它不再是缺省的事件名。 换句话说,必须添加 AS "Process" 以得到像Gambas2一样的特性。

用赋值语句可以创建一个对内部 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

参见