如何从文件读取值为Asterisk拨号计划全局变量赋值?
Asterisk全局变量从文件读取值的正确实现方法
你之前的写法无效,是因为Asterisk的[globals]段仅支持静态赋值或环境变量引用,不能直接执行FILE()/ReadFile()这类函数——这些函数只会被当作字符串字面量赋值给变量,不会实际读取文件内容。
下面是三种可行的实现方案:
方案一:拨号计划初始化时动态设置全局变量
这种方法可以在Asterisk运行时读取文件内容,且支持不重启更新变量值。
- 先在
[globals]段保留变量的默认空值:
[globals] SALES=Dahdi/9&Dahdi/10&Dahdi/11 CUSTSVC= ; 先留空,后续初始化时覆盖
- 添加一个初始化专用的上下文,用来读取文件并设置全局变量:
[init] exten => s,1,NoOp(Loading CUSTSVC from file) exten => s,n,Set(GLOBAL(CUSTSVC)=FILE(/home/richard/InTheOffice.txt)) exten => s,n,Return()
- 在主拨号计划上下文里,确保初始化逻辑只执行一次(避免每次呼叫都重复读取文件):
[default] ; 检查是否已完成初始化 exten => _X.,1,GotoIf($[${GLOBAL(INIT_DONE)} = 1]?proceed) ; 标记初始化完成 exten => _X.,n,Set(GLOBAL(INIT_DONE)=1) ; 执行初始化 exten => _X.,n,Goto(init,s,1) ; 正常处理呼叫 exten => _X.,n(proceed),NoOp(Handling call to ${EXTEN}) ; 使用全局变量 exten => _X.,n,Dial(${GLOBAL(CUSTSVC)},20) ; 后续呼叫逻辑...
方案二:通过shell脚本设置环境变量,在全局变量中引用
这种方法适合文件内容不常变动的场景,需要重启Asterisk生效。
- 编写启动Asterisk的shell脚本(比如
start_asterisk.sh):
#!/bin/bash # 读取文件内容并设置环境变量 export CUSTSVC=$(cat /home/richard/InTheOffice.txt) # 启动Asterisk asterisk -c
- 给脚本添加执行权限:
chmod +x start_asterisk.sh
- 在
extensions.conf的[globals]段引用环境变量:
[globals] SALES=Dahdi/9&Dahdi/10&Dahdi/11 CUSTSVC=${ENV(CUSTSVC)}
- 用这个脚本启动Asterisk即可。
方案三:直接在使用时调用FILE()函数
如果不需要提前赋值给全局变量,可以在需要使用分机列表的地方直接读取文件,实时性最好。
示例:
[default] exten => 123,1,Dial(${FILE(/home/richard/InTheOffice.txt)},20) ; 其他逻辑...
注意事项
- 确保
InTheOffice.txt文件内容为单行字符串(比如Dahdi/12&Dahdi/13&Dahdi/14),FILE()函数默认只读取第一行。 - 保证Asterisk进程拥有该文件的读取权限(可通过
chown asterisk:asterisk /home/richard/InTheOffice.txt调整权限)。
内容的提问来源于stack exchange,提问作者gatorreina
相关产品推荐
相关产品推荐

