リモート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'

回答:


28
ssh host 'ls -als'

リモートシステム上でコマンドを実行するようにsshに要求すると、sshは通常、リモートセッションにPTY(pseudo-TTY)を割り当てません。sshを実行し-tて、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

1
実際、この答えは間違っています。以下の@ alexander-vorobievの答えをご覧ください。
アーメドマスード

2

対話型セッションを持つだけでは機能しません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

これは正解であるはずです
アーメドマスード

1
より簡単な方法は、使用することです[[ ${SHELLOPTS} =~ (vi|emacs) ]] && echo 'line-editing on' || echo 'line-editing off'
アーメドMasud

1

bashセッションで行の編集が許可されているかどうかを確認する 'if'ステートメントにバインドコマンドを配置します。

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つのコマンドだけでは大きな違いはありません。しかし、数十のようにもっとたくさんある場合は、適切な条件がおそらくより良いでしょう。


いい視点ね。賛成票を持っている。:
ジョナサンハートリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.