私の.bashrcには次のものがあります。
# Alt+L lists current directory
bind -x "\"\el\":ls -ltrF --color=auto;"
# trap commands and echo them to xterm titlebar.
trap 'echo -ne "\033]0;$BASH_COMMAND - $USER@${HOSTNAME}>$(pwd)\007"' DEBUG
問題のデモ:
bash-4.2$ [Alt+L] #works
total 0
-rw-rw-r-- 1 me 1234 0 Aug 3 07:11 foo
-rw-rw-r-- 1 me 1234 0 Aug 3 07:11 bar
bash-4.2$ ls -ltr #fails first time
bash: -ltr: command not found
bar foo
bash-4.2$ ls -ltr #works second time
total 0
-rw-rw-r-- 1 me 1234 0 Aug 3 07:11 foo
-rw-rw-r-- 1 me 1234 0 Aug 3 07:11 bar
ご覧のとおり、キーバインディングを実行した後、ls
コマンドは最初に失敗します。私はそれが罠に関係していると信じています。トラップを削除すると、問題が修正されます。
トラップを削除せずにこれを修正する方法はありますか?
これをあなたの~/.inputrc:
に入れてください:
"\M-l": "ls -ltrF\r"
はるかに小さな例でこれを再現できます。 Debiansqueezeのbash4.1とソースからコンパイルされたbash4.2.8(9)を試してみました。
_% bash --norc
bash-4.1$ echo $BASH_VERSION
4.1.5(1)-release
bash-4.1$ bind -x '"\037":echo foo;'
bash-4.1$ trap '$()' DEBUG
foo
bash-4.1$ echo bar
bash: bar: command not found
bash-4.1$
_
押した Ctrl+_ (_\037
_)trap
コマンドが返された直後。トラップ$()
内のコマンドは、空の出力を生成する空のコマンドであるため、何も実行されません。コマンド置換は、_:
_またはスペースで置き換えても予期しないことが起こらないため、原因のようです。
$()
とスペースの動作の違いを説明する方法がわからないので、これはバグのように見えます。バグバッシュリストをざっと検索しても何も見つかりませんでした。