web-dev-qa-db-ja.com

リモートSSHコマンド-bashバインド警告:行編集が有効になっていません

私は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'
17
Brian
ssh Host 'ls -als'

リモートシステムでコマンドを実行するようにsshに要求した場合、sshは通常、リモートセッションにPTY(疑似TTY)を割り当てません。 -tを指定してsshを実行し、ttyを強制的に割り当てることができます。

ssh -t Host 'ls -als'

常に入力したくない場合は、次の行をローカルホストの「.ssh/config」ファイルに追加できます。

RequestTTY yes

または、リモートシステムの「.bashrc」ファイルを修正して、セッションがインタラクティブでない場合にセッションがインタラクティブであると想定するコマンドを実行しないようにすることもできます。 1つの方法は、セッションにTTYがあることをテストでコマンドを囲むことです。

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

bindを機能させるには、インタラクティブセッションを用意するだけでは不十分です。たとえば、emacs Shellはif [ -t 1 ]テストに合格するインタラクティブセッションを提供しますが、行編集がないため、~/.bashrcbindsは警告を生成します。代わりに、次のような方法で行編集が有効になっているかどうかを確認できます(より簡単で良い方法はありますか?):

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

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

これはやや洗練されていませんが、動作するはずです。他の答えは、最良/十分なテストについて同意しません。私のアプローチはこれを回避します。ただし、適切にスケーリングされません。 2つのコマンドだけで大きな違いが生じることはありません。しかし、数十のようにそれ以上ある場合は、適切な条件式がおそらくより良いでしょう。

1