13

Я использую bash 4.3.11(1) и у меня установлен следующий плагин истории (через .bash_it):

# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'

Когда я вхожу в интерактивный сеанс, все хорошо, но когда я запускаю удаленные команды, например, через ssh host 'ls -als' , я вижу следующий вывод:

: ssh host 'ls -als'
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 3: bind: warning: line editing not enabled
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 4: bind: warning: line editing not enabled

Когда я изменяю плагин истории с echo -e '\0033\0143' после каждого вызова связывания, я больше не получаю предупреждения, но моя консоль очищается. Не большой недостаток, но было бы неплохо знать более чистый способ подавления этого для удаленных команд.

# Works, but annoyingly clears console
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
echo -e '\0033\0143'
bind '"^[[B":history-search-forward'
echo -e '\0033\0143'

2 ответа2

24
ssh host 'ls -als'

Когда вы просите ssh выполнить команду в удаленной системе, ssh обычно не выделяет PTY (псевдо-TTY) для удаленного сеанса. Вы можете запустить ssh с -t чтобы заставить его выделить tty:

ssh -t host 'ls -als'

Если вы не хотите вводить это все время, вы можете добавить эту строку в файл ".ssh/config" на вашем локальном хосте:

RequestTTY yes

Кроме того, вы можете исправить файл «.bashrc» в удаленной системе, чтобы избежать запуска команд, которые предполагают, что сеанс является интерактивным, когда это не так. Один из способов заключается в том, чтобы заключить команды в тест, что у сеанса есть TTY:

if [ -t 1 ]
then
    # standard output is a tty
    # do interactive initialization
fi
0

Интерактивного сеанса недостаточно, чтобы bind работу. Например, оболочка emacs предоставляет интерактивный сеанс, который проходит тест if [ -t 1 ] но не имеет редактирования строки, поэтому любые bind в вашем ~/.bashrc будут генерировать предупреждения. Вместо этого вы можете проверить, включено ли редактирование строки, выполнив что-то вроде этого (есть ли более простой / лучший способ?):

if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
  echo "line editing is on"
fi

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