You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从文件读取值为Asterisk拨号计划全局变量赋值?

Asterisk全局变量从文件读取值的正确实现方法

你之前的写法无效,是因为Asterisk的[globals]段仅支持静态赋值或环境变量引用,不能直接执行FILE()/ReadFile()这类函数——这些函数只会被当作字符串字面量赋值给变量,不会实际读取文件内容。

下面是三种可行的实现方案:

方案一:拨号计划初始化时动态设置全局变量

这种方法可以在Asterisk运行时读取文件内容,且支持不重启更新变量值。

  1. 先在[globals]段保留变量的默认空值:
[globals]
SALES=Dahdi/9&Dahdi/10&Dahdi/11
CUSTSVC= ; 先留空,后续初始化时覆盖
  1. 添加一个初始化专用的上下文,用来读取文件并设置全局变量:
[init]
exten => s,1,NoOp(Loading CUSTSVC from file)
exten => s,n,Set(GLOBAL(CUSTSVC)=FILE(/home/richard/InTheOffice.txt))
exten => s,n,Return()
  1. 在主拨号计划上下文里,确保初始化逻辑只执行一次(避免每次呼叫都重复读取文件):
[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生效。

  1. 编写启动Asterisk的shell脚本(比如start_asterisk.sh):
#!/bin/bash
# 读取文件内容并设置环境变量
export CUSTSVC=$(cat /home/richard/InTheOffice.txt)
# 启动Asterisk
asterisk -c
  1. 给脚本添加执行权限:
chmod +x start_asterisk.sh
  1. 在extensions.conf的[globals]段引用环境变量:
[globals]
SALES=Dahdi/9&Dahdi/10&Dahdi/11
CUSTSVC=${ENV(CUSTSVC)}
  1. 用这个脚本启动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:42:34