【发布时间】:2021-04-03 00:20:19
【问题描述】:
我需要从 Asterisk dialplan 调用 shell 调用,以便将一些数据记录到文本文件中,所以我尝试了这个:
Set(log=[${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}] [${UNIQUEID}] ${ARG1})
SYSTEM(echo "${log}" >> /var/log/asterisk/log.txt)
(不能对ARG1 的内容做出任何假设。它可能包含单引号、双引号、& 或任何其他字符。)
这似乎可行,但我最近发现呼叫者 ID 中包含 & 的呼叫在进入开关后立即被丢弃,因为函数崩溃并且呼叫被丢弃。
我尝试用单引号替换echo语句中的双引号,但是如果调用方ID名称包含单引号,该函数不会崩溃但它根本不会回显任何内容。
这是我的困境:
- 我无法逃脱任何事情(至少手动)。
ARG1每次调用都是可变的,实际上可以是任何东西。因此,这不是我可以简单地转义引号的静态字符串。 - 我不能使用 HEREDOC,这似乎是推荐的方法。我正在使用 SYSTEM() 调用 shell 调用,这让我有机会执行 shell 代码。我不能为所有 EOF 内容设置一堆单独的行。
- 我也不知道如何将其传递到 bash 脚本中来执行此操作。我需要将整个 $log 变量放入脚本中,以便在那里执行 HEREDOC 的工作,并且我将遇到与现在相同的问题 - 如何让整个事情完好无损,而不会导致错误.
- 由于这是一个单一的 shell 调用,因此我运行的任何命令都需要是 bash 单行代码。
变量日志本身在展开时不包含任何变量。这里有什么方法可以使回显按需要工作吗?
【问题讨论】:
-
您是否尝试转义特殊字符或使用 printf 而不是 echo?这可能会有所帮助:stackoverflow.com/questions/15783701/…
-
@Lety 我确实研究了 printf %q 的东西,这似乎很有希望,但也无法让它发挥作用。与执行 echo '${log}' 的问题相同。我认为问题在于它不是 bash 变量,它是我正在使用的程序中的一个变量,当它到达 SYSTEM/shell 调用时,它已经被替换,因此所有 bash 看到的是一个没有被引用的字符串文字对。
-
@oguzismail 我可以,但我想记录原始来电显示号码和姓名。
标签: shell asterisk quotes single-quotes