Remote SSH Commands – bash bind warning: line editing not enabled

bashshellssh

I am using bash 4.3.11(1) and have the following history plugin installed (via .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'

When I log in to an interactive session all is well but when I run remote commands via ssh host 'ls -als' for example, I see the following output:

: 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

When I modify the history plugin with echo -e '\0033\0143' after each bind call I no longer get the warnings but my console is cleared. Not a huge drawback but it would be nice to know a cleaner way to suppress this for remote commands.

# 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'

Best Answer

Having an interactive session is not enough for bind to work. For instance emacs shell provides an interactive session which passes the if [ -t 1 ] test but it does not have the line editing so any binds in your ~/.bashrc will generate the warnings. Instead, you can check if the line editing is enabled by doing something like this (is there a simpler/better way?):

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