LINUX.ORG.RU

Tcl и вызов внешней команды


0

0

Проблема такая. В tcl-скрипте я вызываю внешнюю команду (/bin/fgrep) вот в таком коде:

set Grep "/bin/fgrep -i -n -f [file normalize $conlogErrfileDir/$errFileName]"
foreach ip $conlogIPList {
set grepFName [file join $ROOTDIR consolecheck $ip]
set conlogCheckData($errFileName,$ip) [eval exec cat $ROOTDIR/consolecheck/$ip | /bin/fgrep -i -n -f $conlogErrfileDir/$errFileName ]
}

в массив conlogCheckData мне необходимо получить результат этого грепа. Цикл проходит, все значения попадают в массив, но после прохода цикла скрипт вылетает с ошибкой child process exited abnormally

Как лечить?

★★★★★

Не мог бы ты описать по-русски, что именно требуется сделать?
А то есть подозрение о вырывании гланд через... ну... хм...

1) В Tcl есть regexp (man n regexp).

2) Если нужно построчно обработать файл, есть for_file (man n TclX).

3) Если тебе нужен лишь выхлоп внешней программы, нафига тебе eval?
Это делается так: set var [exec cmd1 arg1 | cmd2 arg2]

4) И зачем именно массив? Просто переменная (она же список) не катит?

5) Твой конвейер, будучи выполненным из-под shell, отрабатывает нормально?

6) Вот кусок проверенного временем кода, просто для примера (получение вывода
внешней программы в список с его последующей сортировкой):

  #Ком.строка программы пересчета времен взрывов в номера входных отсчетов.
  set bk "gsztime -d '$recdir' -l $len"

  #Запись расстояний, которые определены.
  #Добивка параметров для программы gsztime.
  if [catch {open $gszdir/dist w} fileid]  {return $fileid}
  foreach src $srclst {
    regexp {^([[:digit:]]+):([[:digit:]]+):([[:digit:]]+)$} $src u num time c
    set dist [string trim [.g.l.list.e$num get]]
    if {$dist != ""}  {puts $fileid $num:$dist}
    append bk " $time:$num"
    }
  close $fileid

  #Получение пар "номер_отсчета:номер_ПВ" для времен взрывов.
  if [catch {exec /bin/sh -c $bk} lst]  {return $lst}
  if {$lst == ""}  {return "этот регистратор не записал ни одного взрыва"}

  #Сортировка полученного списка по возрастанию номеров отсчетов.
  set lst [lsort -command cmp_pairs [string map {\n \ } $lst]]

anonymous
()

> Цикл проходит, все значения попадают в массив, но после прохода цикла скрипт вылетает с ошибкой child process exited abnormally

Точно проходит? Дело в том, что grep возвращает ненулевой статус, если ничего не нашел.

watashiwa_daredeska ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.