내 .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
키 바인딩을 실행한 후 처음으로 명령이 실패합니다. 나는 이것이 함정과 관련이 있다고 생각합니다. 트랩을 제거하면 문제가 해결됩니다.
트랩을 제거하지 않고 이 문제를 해결할 수 있는 방법이 있나요?
답변1
나는 이것을 더 작은 예로 재현할 수 있습니다. 나는 Debian squeeze에서 bash 4.1을 시도하고 소스에서 컴파일된 bash 4.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
$()
:
와 공백 사이의 동작 차이를 해석하는 방법을 모르므 $()
로 이는 버그처럼 보입니다. bug-bash 목록을 대충 검색해도 아무것도 나오지 않았습니다.
답변2
이것을 당신의 ~/.inputrc:
:
"\M-l": "ls -ltrF\r"