Bash: problema de atalho / armadilha

4

Meu .bashrc tem o seguinte:

# Alt+L lists current directory
bind -x "\"\el\":ls -ltrF --color=auto;"

# trap commands and echo them to xterm titlebar.
trap 'echo -ne "3]0;$BASH_COMMAND - $USER@${HOSTNAME}>$(pwd)
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
7"' DEBUG

Demonstração do problema:

# Alt+L lists current directory
bind -x "\"\el\":ls -ltrF --color=auto;"

# trap commands and echo them to xterm titlebar.
trap 'echo -ne "3]0;$BASH_COMMAND - $USER@${HOSTNAME}>$(pwd)
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
7"' DEBUG

Como você pode ver, o comando ls falha na primeira vez após a execução da ligação de chave. Eu acredito que tem a ver com a armadilha. Remover a armadilha resolve o problema.

Existe alguma maneira de corrigir isso sem remover a armadilha?

    
por dogbane 03.08.2011 / 13:16

2 respostas

0

Coloque isso no seu ~/.inputrc: :

"\M-l":    "ls -ltrF\r"
    
por 04.08.2011 / 01:03
1

Eu posso reproduzir isso com um exemplo bem menor. Eu tentei no bash 4.1 do Debian squeeze e um bash 4.2.8 (9) compilado da fonte.

% bash --norc
bash-4.1$ echo $BASH_VERSION
4.1.5(1)-release
bash-4.1$ bind -x '"7":echo foo;'
bash-4.1$ trap '$()' DEBUG
foo
bash-4.1$ echo bar
bash: bar: command not found

bash-4.1$

Pressione Ctrl + _ ( 7 ) imediatamente após o retorno do comando trap . O comando na armadilha $() é um comando vazio produzindo saída vazia, portanto, um não-op. A substituição de comando parece ser o culpado, já que nada inesperado acontece se eu substituí-lo por : ou por um espaço.

Eu não vejo como explicar uma diferença de comportamento entre $() e um espaço, então isso parece um bug. Uma pesquisa superficial na lista de bug-bash não mostrou nada.

    
por 04.08.2011 / 00:42