web-dev-qa-db-ja.com

Bash:キーバインド/トラップの問題

私の.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コマンドは最初に失敗します。私はそれが罠に関係していると信じています。トラップを削除すると、問題が修正されます。

トラップを削除せずにこれを修正する方法はありますか?

4
dogbane

これをあなたの~/.inputrc:に入れてください:

"\M-l":    "ls -ltrF\r"
0
amphetamachine

はるかに小さな例でこれを再現できます。 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コマンドが返された直後。トラップ$()内のコマンドは、空の出力を生成する空のコマンドであるため、何も実行されません。コマンド置換は、_:_またはスペースで置き換えても予期しないことが起こらないため、原因のようです。

$()とスペースの動作の違いを説明する方法がわからないので、これはバグのように見えます。バグバッシュリストをざっと検索しても何も見つかりませんでした。