私は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'
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
bind
を機能させるには、インタラクティブセッションを用意するだけでは不十分です。たとえば、emacs Shellはif [ -t 1 ]
テストに合格するインタラクティブセッションを提供しますが、行編集がないため、~/.bashrc
のbind
sは警告を生成します。代わりに、次のような方法で行編集が有効になっているかどうかを確認できます(より簡単で良い方法はありますか?):
if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
echo "line editing is on"
fi
Bindコマンドを「if」ステートメントに入れて、bashセッションが行編集を許可するかどうかを確認します。
if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'
fi
行編集がない場合、これらのbind
コマンド自体は無害です。警告を抑制します。
bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward' 2>/dev/null
これはやや洗練されていませんが、動作するはずです。他の答えは、最良/十分なテストについて同意しません。私のアプローチはこれを回避します。ただし、適切にスケーリングされません。 2つのコマンドだけで大きな違いが生じることはありません。しかし、数十のようにそれ以上ある場合は、適切な条件式がおそらくより良いでしょう。