Unbuffer перестал работать несколько месяцев назад

Я нахожу команду "unbuffer" очень важной и полезной, потому что я запускаю код на Python, и я не думаю, что я могу просто поместить что-то эквивалентное fflush() везде.

Я использовал это просто отлично: unbuffer python foo.py | tee filename.log

Несколько месяцев назад я не был уверен, позволил ли мне Ubuntu 16.04 автоматически обновлять некоторые программы, и он перестал работать.

$ unbuffer
can't find package Expect
    while executing
"package require Expect"
    (file "/usr/bin/unbuffer" line 6)

Я попытался отредактировать некоторые файлы и изменить Expect в нижнем регистре expect но это не сработало.

Я пытался (несколько месяцев назад) с помощью инструментов apt-get удалить и переустановить Expect, но безрезультатно. Я удивлен, что не могу гуглить это и нахожу, что другие жалуются, что это не работает.

Я только что попробовал это на 18.04 Ubuntu друга. Он никогда не использовал его, он загрузил его с помощью apt-get и получил такое же сообщение об ошибке. Любая помощь приветствуется.

Спасибо @pynexj за предложение cat /usr/bin/unbuffer:

#!/bin/sh
# -*- tcl -*-
# The next line is executed by /bin/sh, but not tcl \
exec tclsh8.6 "$0" ${1+"$@"}

package require expect


# -*- tcl -*-
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST

if {[string compare [lindex $argv 0] "-p"] == 0} {
    # pipeline
    set stty_init "-echo"
    eval [list spawn -noecho] [lrange $argv 1 end]
    close_on_eof -i $user_spawn_id 0
    interact {
    eof {
        # flush remaining output from child
        expect -timeout 1 -re .+
        return
    }
    }
} else {
    set stty_init "-opost"
    set timeout -1
    eval [list spawn -noecho] $argv
    expect
    exit [lindex [wait] 3]
}

Я использовал conda на этой машине, но я провожу эти тесты в терминале, где я не делал никаких source activate, Первый элемент на моем пути - это /home/myusername/anaconda3/bin, если это имеет значение.

$ apt list --installed | grep -i expect

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

expect/xenial,now 5.45-7 amd64 [installed]
python3-pexpect/xenial,xenial,now 4.0.1-1 all [installed]
tcl-expect/xenial,now 5.45-7 amd64 [installed,automatic]

$ locate '*expect*pkgIndex.tcl'
/usr/lib/tcltk/x86_64-linux-gnu/expect5.45/pkgIndex.tcl

Спасибо @glenn Джекман, я обнаружил, что мой tclsh находится в ~/anaconda3/bin/tclsh и указывает на tclsh8.6 Я думаю, это означает, что он был установлен как часть моей установки conda. Как отмечалось выше, anaconda3/bin находится в верхней части моего PATH. Я ничего не построил сам.

Знаем ли мы, что 8.6 старое или новое? Должен ли я попытаться выполнить обновление apt-get для tcl или tclsh вне контекста и посмотреть, поможет ли это?

2 ответа

Решение

Я считаю, что столкнулся с точно такой же проблемой, в первую очередь вызванной установкой Anaconda. Похоже, моя система обращалась к тому, что принесла Анаконда, а не к тому, что было установлено много лет назад - и в остальном все еще присутствует.

В соответствии с https://anaconda.org/Eumetsat/expect мне нужно было только оформить

conda install -c eumetsat expect

чтобы привести вещи в порядок.

Это сработало для меня на Mac. Пришлось префикс команды с ожидать

      $ unbuffer date
can't find package Expect
    while executing
"package require Expect"
    (file "/usr/local/bin/unbuffer" line 6)

Работающий

      $ expect /usr/local/bin/unbuffer date
Fri Sep  9 13:29:28 IST 2022
Другие вопросы по тегам