远程SSH命令-bash绑定警告:未启用行编辑


17

我正在使用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'

Answers:


28
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

1
其实这个答案是不正确的,请参阅下面的@ alexander-vorobiev答案。
艾哈迈德·马苏德

2

进行交互式会话不足以进行bind工作。例如emacs shell提供了一个通过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

这应该是正确的答案
Ahmed Masud

1
更简单的方法是使用[[ ${SHELLOPTS} =~ (vi|emacs) ]] && echo 'line-editing on' || echo 'line-editing off'
艾哈迈德·马苏德

1

将bind命令放入“ if”语句中,该语句检查bash会话是否允许行编辑:

if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then
    bind '"^[[A":history-search-backward'
    bind '"^[[B":history-search-forward'
fi

1

如果没有行编辑,则这些bind命令本身是无害的。禁止显示警告:

bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward'  2>/dev/null

这有点不雅致,它仍然应该起作用。其他答案不同意最佳/充分的测试。我的方法规避了这一点。但是它的伸缩性不好。仅这两个命令就不会有太大的不同;但是如果您有更多(如数十个),那么适当的条件可能会更好。


好点子。进行投票。:-)
乔纳森·哈特利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.