Как передать параметры в EXPECT с помощью '-c' option?

Вот еще один способ с помощью join:

join -1 1 -2 2 -o 0 2.1 <(sort -k1,1 file1.txt) <(cut -d ' ' -f1 1.txt 2.txt | sort | uniq -c)

обратите внимание, что вывод будет отсортирован:

get 1
move 2
put 1

Если вы хотите сохранить порядок из file1.txt, например,

move 2
get 1
put 1

вы можете запустить:

join -j2 -o 1.1 0 2.1 <(nl -ba -nrz file1.txt | sort -k2,2) \
<(cut -d ' ' -f1 1.txt 2.txt | sort | uniq -c) | sort -k1 | cut -d ' ' -f2-
2
02.03.2018, 03:17
1 ответ

Вы не можете. В исходном коде для expect-5.45.4мы находим в exp_main_sub.cв строке 711

            case 'c': /* command */
                    exp_cmdlinecmds = TRUE;
                    rc = Tcl_Eval(interp,optarg);
                   ...

, который обрабатывает код -c. $argvи друзья создаются только после того, как -ceval завершится в строке 850 и далее

    /* collect remaining args and make into argc, argv0, and argv */
    sprintf(argc_rep,"%d",argc-optind);
    Tcl_SetVar(interp,"argc",argc_rep,0);
    expDiagLog("set argc %s\r\n",argc_rep);

   ...
    Tcl_SetVar(interp,"argv",args,0);

, поэтому $argvабсолютно не существует, когда выполняется код -c.

Одно из обходных решений: Запустить локальный сценарий ожидания на удаленном сервере? , что влечет за собой передачу кода TCL на стандартный ввод и последующее чтение в expectфайла/dev/stdin

$ echo puts \[lindex \$argv 1\] | expect /dev/stdin blee bla blu
bla

Другой обходной путь — выбросить оболочку и написать все это на TCL

#!/usr/bin/env expect
set FILE [lindex $argv 0]
set HOST [lindex $argv 1]
...

А потом chmod +xэто и запустить

./whatyoucalledtheabove somefile somehost

Он должен содержать все, что делает ваш текущий сценарий оболочки выше вызова expect...

5
27.01.2020, 21:58

Теги

Похожие вопросы