在ssh连接中使用Expect时awk很奇怪的解析'〜'解析错误

时间:2019-07-03 11:00:57

标签: awk expect

我正在尝试根据计算机的内存使用量自动建立符号链接,为此,我想先检查主目录下的哪个目录使用的内存最多,为此,我正在使用此命令

cd /directory && du -h 2>/dev/null | awk '{ if ($1 ~ /G/) {print $0}}' | grep './' | awk -F '.' '{print $3}' 这在ssh连接上可以完美地工作,但是当我尝试将其放在脚本中时,我得到了错误:

{ if ( ~ /G/) {print myscriptname}}
       ^ parse error
{ if ( ~ /G/) {print myscriptname}}
            ^ parse error

对此我最不满意的是,即使我通过ssh连接运行命令,该命令仍试图以某种方式尝试使用实际脚本的文件名作为参数。

我的完整代码是

#!/bin/bash
expect <<-EOF
set timeout 5
spawn ssh -oPort=22 user@ip
expect "*password" { send "password\r" }
expect "*#" { send "cd /directory && du  -h 2>/dev/null | awk '{ if ($1 ~ /G/)  {print $0}}' | grep './' | awk -F '.' '{print $3}'\r" }
expect "*#" { send "exit\r" }
EOF

1 个答案:

答案 0 :(得分:1)

这归因于send的双引号参数-Tcl将在双引号字符串中扩展任何$variables

您可能想要更改

expect "*#" { send "cd /directory && du  -h 2>/dev/null | awk '{ if ($1 ~ /G/)  {print $0}}' | grep './' | awk -F '.' '{print $3}'\r" }

为此,使用大括号防止变量扩展

expect "*#" { 
    send {cd /directory && du  -h 2>/dev/null | awk '$1 ~ /G/ && /.\// {print $0}' | awk -F '.' '{print $3}'}
    send "\r"
}

是的,是的,我看到了一个主要问题:您期望的代码在shell heredoc中,并且需要进行变量扩展。那是在期望未启动之前发生的。

这里的秘密是告诉外壳将整个文档单引号:

expect << 'EOF'
...
EOF

现在,$1$0将留给awk使用。