Вот мой сценарий:

Я хочу перенести ~/foo.txt на сервер aoneill@bar .

Я начинаю печатать в моей командной строке:

aoneill@aoneill-Laptop:~$ scp fo

В этот момент я нажимаю <tab> чтобы завершить имя файла, и мой терминал просто зависает. Он не изменится в зависимости от нажатия клавиши, а курсор просто застрянет прямо рядом с fo , если я не <ctrl-C> вышел.

Я бегу Ubuntu 13.10, и я включаю . /etc/bash_completion в моем .bashrc .

Это единственная программа, с которой я действительно сталкиваюсь с этой проблемой, и она, похоже, не является общей проблемой.

Спасибо за помощь!

2 ответа2

0

Я столкнулся с этим с Ubuntu 14.04. Использование set -x показывает, что автозаполнение зависало на ruptime. Когда я попытался запустить ruptime самостоятельно, я обнаружил, что он не установлен. После установки пакета rwho зависание было исправлено.

sudo apt-get установить rwho

COMPREPLY+=($( compgen -W         "$( ruptime 2>/dev/null | awk '!/^ruptime:/ { print $1 }' )"         -- "$cur" ))
+++ ruptime
+++ awk '!/^ruptime:/ { print $1 }'

Строка COMPREPLY вызывает ruptime без проверки, чтобы увидеть, существует ли она. И так как у меня включено «COMMAND_NOT_FOUND_INSTALL_PROMPT = 1», команда пытается спросить меня, хочу ли я установить его, но канал захватывает вывод и зависает.

Таким образом, ошибка может заключаться в том, что COMMAND_NOT_FOUND_INSTALL_PROMPT не проверяет, используется ли он в конвейере. Или этот COMPREPLY не проверяет, установлена ли команда первой.

Опубликован баг с группой «команда не найдена». https://bugs.launchpad.net/command-not-found/+bug/1534175

0

В этот момент я нажимаю вкладку, чтобы завершить имя файла,…

... и компьютер, совершенно не в состоянии прочитать ваши мысли, сделал то, что он на самом деле делает, когда в тот момент нажата вкладка , то есть пытается завершить имя хоста, возможно, консультируясь со всеми видами вещей от вывода avahi-browse до вывода ruptime Этот процесс может занять некоторое время.

(Храбрый может пойти и посмотреть на функцию _known_hosts_real в /usr/share/bash-completion/bash-completion .)

Чтобы завершить имя файла в этой точке, введенное вами слово должно содержать косую черту (/) или начинаться с точки (.) Или тильды (~).

(Храбрый может так же понять, почему это происходит из функции _scp в /usr/share/bash-completion/completions/scp .)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .