awk странный синтаксический анализ '~' ошибка синтаксического анализа при использовании ожидаемого в ssh-соединении - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь автоматизировать создание символических ссылок в зависимости от использования памяти машиной, для этого я хочу сначала проверить, какой каталог в моем главном каталоге использует больше всего памяти, для этого я использую эту команду

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 Ответ

1 голос
/ 03 июля 2019

Это связано с аргументом, заключенным в двойные кавычки 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"
}

Ах, да, я вижу главную проблему: ваш ожидаемый код находится в оболочке heredoc, и это зависит от расширения переменной. Это происходит раньше, чем ожидают, даже запущен.

Секретный соус здесь состоит в том, чтобы сказать оболочке заключить в кавычки весь документ здесь:

expect << 'EOF'
...
EOF

Теперь $1 и $0 будут оставлены для awk.

...