/ / Как да използвате променливите на баш скрипта в очакването условни изявления - bash, очаквайте

Как да използвате променливите на баш сценария в очакването условни изявления - bash, очаквайте

Аз пиша баш скрипт и използвам очаквам да направяSFTP. Сега в очакването блок искам да има достъп до баш променлива в условно изявление. но не мога да го направя. Може ли някой да помогне в това. Също така, изпълнението на този скрипт се контролира от програма c и аз няма да пренасочи изхода към дневника файл (който отново е динамичен) .Мога ли да направя това и да потискат всички изход на stdout
тук е кодът

!/usr/bin/bash
host=$1
user=$2
pass=$3
action=$4
path=$5
echo "Starting...."

function doAction {

strAction="""$action"""
echo $strAction

/usr/bin/expect <<EOF > logfile.txt
**set bashaction $strAction**
spawn sftp $user@$host

expect "password:"
send "$passr"
expect"sftp>"
send "cd $pathr"
**if {$bashaction == "TEST"} {**
expect "sftp>"
send "promptr"
}

expect "sftp>"
send <sftp command>
expect "sftp>"
send_user "quitn"

exit
EOF
}

doAction
echo "DONE....."

за 1. използване на опитен скрипт вместо да работи.
за проблема за влизане в системата, използвайки log_user 0 и log_file -a помогна

Отговори:

9 за отговор № 1

Не е нужно да използвате bash, expect може да се справи с всичко това:

#!/usr/bin/expect

set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set action [lindex $argv 3]
set path [lindex $argv 4]
puts "Starting...."

puts ""$action""
spawn sftp $user@$host

expect "password:"
send "$passr"

expect"sftp>"
send "cd $pathr"

if {$action == "TEST"} {
# Do something
} else {
# Do something else
}

expect "sftp>"
send_user "quitr"

puts "DONE....."

Идващи от bash, Tcl / Expect синтаксиса е малко странно, но не би трябвало да имате проблем, разширявайки горния скелет. Късмет.


2 за отговор № 2

Достъп до променливи на средата от TCL и очаквайте

Тъй като се обаждате на този скрипт Expect от друг процес, можете да използвате променливи на средата. Например, ако родителският ви процес е експортиран действие за околната среда, тогава можете да получите достъп до стойността му в рамките на очаквания скрипт с:

$::env(action)

В Баш можеш маркирайте променливата за експорт с износ Вградената. Например:

export action

Тъй като не съм сигурен как извиквате скрипта Expect от C, зависи от вас, за да сте сигурни, че променливата е правилно експортирана.

Деактивиране на регистрирането в стандартен изход

За да деактивирате регистрацията на стандартния изход от заредените процеси, Expect предоставя командата log_user. Можете да предотвратите възникването на процесите на заразяване от писане до stdout log_user 0.

Очаквайте (1) ръководството казва:

По подразбиране диалоговият прозорец изпращане / очакване е вписан вstdout (и a ако е отворен). Записването в стpout е деактивирано от командата "log_user 0" и отново активиран от "log_user 1". Влизане в регистрационния файл не се променя.

Това всъщност не е така близо стандартен изход, който по принцип не е това, което искате все пак. Това ще доведе до всичко, което пише на stdout да хвърли грешка като това:

can not find channel named "stdout"
while executing
"puts hello"
(file "/tmp/foo" line 8)

0 за отговор № 3

За да изключите изхода на ството, което можете да използвате

command here >/dev/null 2>/dev/null

За да пишете в дневника, можете да използвате подобни тръби (> или >>), или tee команда, ако искате да напишете изхода в средата на дългата тръба.