Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl 使用awk时exp\u send中的转义^symbol_Tcl_Expect - Fatal编程技术网

Tcl 使用awk时exp\u send中的转义^symbol

Tcl 使用awk时exp\u send中的转义^symbol,tcl,expect,Tcl,Expect,因此,我需要从expect脚本传递一个Awk命令来识别一个eth接口,该接口包含一个特定的八位字节,我目前正在做 exp_send "ip addr show | awk -F: '/\^\[0-9\]/ {dev=\$2} /inet .*\\.227/ {print dev; exit}' \r" 问题在于/\^\[0-9\]部分,单个\不起作用,我还尝试添加了似乎也不起作用的\ 还尝试将整个awk内容包装到{..}中,但同样无效 exp_send "ip addr show | awk

因此,我需要从expect脚本传递一个
Awk
命令来识别一个
eth
接口,该接口包含一个特定的八位字节,我目前正在做

exp_send "ip addr show | awk -F: '/\^\[0-9\]/ {dev=\$2} /inet .*\\.227/ {print dev; exit}' \r"
问题在于
/\^\[0-9\]
部分,单个
\
不起作用,我还尝试添加了似乎也不起作用的
\

还尝试将整个
awk
内容包装到
{..}
中,但同样无效

exp_send "ip addr show | awk -F: {/^\[0-9\]/ {dev=\$2} /inet .*\.227/ {print dev; exit}} \r"
任何关于如何解决这一问题的线索都将不胜感激


更新,根据@whjm的建议,我启用了内部调试器选项

exp_internal -f /tmp/debug 1
exp_send "ip addr show | awk -F: '/^\[0-9]/ {dev=\$2} /inet .*\\.227/ {print dev; exit}'\r"
exp_internal 0
生成信息作为

send: sending "ip addr show | awk -F: '/^[0-9]/ {dev=$2} /inet .*\.227/ {print dev; exit}'\r" to { exp13 }
终端设备上的控制台捕获会产生

$ send: sending "ip addr show | awk -F: '/[0-9]/ {dev=$2} /inet .*\.227/ {print dev; exit}'\r" to { exp13 }
ip addr show | awk -F: '/[0-9]/ {dev=$2} /inet .*\.227/ {print dev; exit}'

^
字符在发送时会丢失。

它似乎是您需要关注的外部引号。试一试

exp_send {ip addr show | awk -F: '/^[0-9]/ {dev=$2} /inet .*\.227/ {print dev; exit}'}
# .......^ using Tcl non-substituting quotes, so inside stuff does not need escaping
exp_send "\r"

这似乎是你需要关注的外部引号。试一试

exp_send {ip addr show | awk -F: '/^[0-9]/ {dev=$2} /inet .*\.227/ {print dev; exit}'}
# .......^ using Tcl non-substituting quotes, so inside stuff does not need escaping
exp_send "\r"

如果您想使用双引号(例如,在其中包含一些
$var
):


在Tcl语言中:

  • ^
    '
    并不特殊
  • {
    在双引号(
    “…”
    )中并不特殊

  • 如果您想使用双引号(例如,在其中包含一些
    $var
    ):


    在Tcl语言中:

  • ^
    '
    并不特殊
  • {
    在双引号(
    “…”
    )中并不特殊


  • 请显示足够的脚本以重现问题。此外,将输入改为指向文件将有助于其他人重现它。@merlin2011:如果我有办法,我会提供它,通常
    expect
    脚本不容易重新创建,可能是在寻找适用于转义meta cha的通用拇指规则
    tcl
    /
    expect
    第一条
    send:sending
    消息确实有
    ^
    但第二条没有。奇怪。介意给出你
    spawn
    ed的确切
    ssh
    命令吗?@whjm:我应该在那里寻找什么可疑的东西吗?同样,这是结构良好的代码,
    ssh
    过程是抽象的我需要通过一系列函数调用来查看实际使用的选项。请显示足够多的脚本来重现问题。此外,将输入改为指向文件将有助于其他人重现问题。@merlin2011:如果我有办法,我会提供它,一般来说,
    expect
    脚本不容易重新创建Eded,可能正在寻找一个通用的拇指规则,适用于转义
    tcl
    /
    expect
    中的元字符。第一个
    发送:发送
    消息确实有
    ^
    ,但第二个没有。奇怪。介意给出你
    生成的确切
    ssh
    命令吗?@whjm:我应该看看有什么可疑的地方吗同样,它是结构良好的代码,
    ssh
    过程是抽象的,我需要通过一系列函数调用来查看实际使用的选项。感谢glenn的回答,当以这种方式发送时,命令显示为
    ip addr show | awk-F:'/[0-9]/{dev=$2}/inet.\.227/{print dev;exit}“
    在终端设备中。请注意,
    ^
    不存在!您如何连接到终端设备?它是telnet?它是通过
    ssh来完成的。只需查看另一个答案中的注释,看看发生了什么:)克拉符号在expect或awk中通常一点也不特殊。您的连接协议正在执行某些操作用反斜杠(
    /\^[0-9]/
    )将其转义,或将其加倍(
    /^[0-9]/
    ),或尝试将其作为十六进制字符发送(
    /\x5e[0-9]/
    )感谢glenn,不幸的是,建议的选项都不起作用。我使用了另一种方法来处理这个问题,一个没有
    ^
    grep
    命令感谢glenn的回答,当以这种方式发送时,命令显示为
    ip addr show | awk-F:'/[0-9]/{dev=$2}/inet.\\.227/{print dev;exit}“
    在终端设备中。请注意,
    ^
    不存在!您如何连接到终端设备?它是telnet?它是通过
    ssh来完成的。只需查看另一个答案中的注释,看看发生了什么:)克拉符号在expect或awk中通常一点也不特殊。您的连接协议正在执行某些操作用反斜杠(
    /\^[0-9]/
    )将其转义,或将其加倍(
    /^[0-9]/
    ),或尝试将其作为十六进制字符发送(
    /\x5e[0-9]/
    )谢谢glenn,不幸的是,所有建议的选项都不起作用。我使用了另一种方法来处理这个问题,一个没有
    ^
    grep
    命令谢谢你的回答。与我对glenn上面的回答的评论类似,你的逻辑使命令显示为
    ip addr show | awk-F:'/[0-9]/{dev=$2}/inet.\.227/{print dev exit}“
    在终端设备上。同样,
    ^
    丢失,这对我来说是不正确的。Tcl/Expect本身不会丢弃
    ^
    字符。你能
    Expect-d/your/script.exp
    并粘贴输出吗?这不是一个简单的
    Expect
    脚本,我正在使用
    Tcl
    文件上的库。因此上下文是脚本在测试台上运行,
    ssh
    进入终端设备,并通过这个
    exp\u send
    来获得包含八位字节的
    ethni
    接口。您可以在
    exp\u internal-f/tmp/debug 1
    exp\u internal 0
    之间放置一些语句。您能详细说明一下吗,还没有使用
    exp\u internal>
    before。我应该在哪里添加它?谢谢你的回答。与我对格伦上述答案的评论类似,你的逻辑使命令在终端设备上显示为
    ip addr show | awk-F:'/[0-9]/{dev=$2}/inet.\.227/{print dev;exit}'
    。同样