
Я использую 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'
решение1
Наличие интерактивного сеанса недостаточно для bind
работы. Например, оболочка emacs предоставляет интерактивный сеанс, который проходит if [ -t 1 ]
тест, но в нем нет редактирования строк, поэтому любые bind
s в вашем ~/.bashrc
будут генерировать предупреждения. Вместо этого вы можете проверить, включено ли редактирование строк, сделав что-то вроде этого (есть ли более простой/лучший способ?):
if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
echo "line editing is on"
fi
решение2
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
решение3
Если нет редактирования строки, то эти bind
команды сами по себе безвредны. Подавите предупреждения:
bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward' 2>/dev/null
Это несколько неэлегантно, но все же должно работать. Другие ответы не сходятся во мнении о лучшем/достаточном тесте. Мой подход обходит это. Однако он плохо масштабируется. Две команды сами по себе не должны иметь большого значения; но если бы у вас было больше, например, десятки, то надлежащее условие, вероятно, было бы лучше.
решение4
Я бы, наверное, просто проверил, является ли мой bash интерактивным.
if [[ "$-" = *i* ]]
then
debug "interactive mode"
source ~/.bash_lib/bindings
else
debug "non interactive mode"
fi