警告: 行編集が有効になっていません

警告: 行編集が有効になっていません

bind -x '"\C-r"':resetターミナルをクリアするのに便利なこのコマンドを見つけましたが、簡単な bash スクリプトを作りたかったのです:

#!/bin/bash
bind -x '"\C-r"':reset

出力:

alfred@alfred-laptop:~/bash$ ./bind 
./bind: line 2: bind: warning: line editing not enabled

誰か説明してください:

  1. これをどうすれば修正できますか?
  2. どういうwarning: line editing not enabled意味?

答え1

そのスクリプトをソースする必要があります。. ./bindまたは を実行してsource ./bind、現在のセッションでそのキー バインディングをアクティブにします。

通常どおり実行すると、ターミナルがないため、そのエラー メッセージが表示されます。また、動作する場合でも、スクリプトの実行中のみアクティブになります。

キーバインドを永続的にしたい場合は、そのコマンドを に追加します~/.bashrc

答え2

私も同様のメッセージを受け取りましたが、私のメッセージは対話型 (ログイン) シェルの外部で実行されたスクリプトからのものでした。つまり、CGI スクリプト経由で実行されたシェル スクリプトでした。私のメッセージは次のとおりでした。

/home/richard/.bash_profile: line 4: bind: warning: line editing not enabled

実際には 4 行目ではありませんでしたが、bindそのファイルには次の記述しかありませんでした。

bind 'set completion-ignore-case on'

もちろん、これは行編集が有効になっている場合、つまり対話型シェルの場合にのみ意味を持ちます。

答え3

受け入れられた回答を改善しようとしているだけです。

line editing not enabled非対話型シェルで実行すると、bindTTY が必要なので" " が表示されます。

bind次のようにコマンドをチェックで囲みます。

if [ -t 1 ]
then
    # standard output is a TTY
    bind -x '"\C-r"':reset
fi

答え4

代わりにシェルが対話型かどうかをテストします。
これは私のディストリビューションのbashrcファイルで見つけたコードブロックです。

# Test for an interactive shell.  There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.
# if [[ $- != *i* ]] ; then
#   # Shell is non-interactive.  Be done now!
#   return
# fi

関連情報