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