GNU Readline의 shell-expand-line 명령이 물결표(~)의 첫 번째 항목만 확장하는 이유는 무엇입니까?

GNU Readline의 shell-expand-line 명령이 물결표(~)의 첫 번째 항목만 확장하는 이유는 무엇입니까?

Bash 매뉴얼에 따르면 shell-expand-lineGNU Readline 명령은 Bash가 일반적으로 하는 것처럼 별칭 및 기록 확장을 포함하여 명령줄을 확장해야 합니다.

현재 설정은 다음을 통해 볼 수 있습니다 bind -P | grep shell-expand-line.

shell-expand-line can be found on "\e\C-e".

~내 문제는 아래 예에서는 첫 번째 물결표( )만 확장된다는 것입니다.

~/foo/bar ~/foo/baz

"\e\Ce"를 누른 후:

/Users/nlykkei/foo/bar ~/foo/baz

왜?

답변1

당신이 그것을 보면소스 코드shell-expand-line, 실제로 호출되어야 함 을 알 수 있습니다 shell-expand-line-as-if-it-were-a-word.

>> bashline.c
static int
shell_expand_line (count, ignore)
     int count, ignore;
{
     ...
      w->word = savestring (rl_line_buffer);
      w->flags = rl_explicit_arg ? (W_NOPROCSUB|W_NOCOMSUB) : 0;
      expanded_string = expand_word (w, rl_explicit_arg ? Q_HERE_DOCUMENT : 0);
>>> subst.c
/* Expand WORD, performing word splitting on the result.  This does
   parameter expansion, command substitution, arithmetic expansion,
   word splitting, and quote removal. */

WORD_LIST *
expand_word (word, quoted)
     WORD_DESC *word;
     int quoted;

이 주석에는 파일 이름이나 물결표 확장자가 포함되지 않습니다. 따라서 기본적으로 첫 번째 물결표에도 작동하는 것은 우연입니다(물결표는 어쨌든 단어의 시작 부분에서만 의미가 있습니다). 그러나 이는 또한 언급되지 않은 프로세스 교체가 될 것입니다. 무거운 작업은 expand_word_internal동일한 파일의 기능에 있습니다.

첫 번째 스니펫 에서 말하는 것은 rl_explicit_arg바인딩된 키 조합 전에 Esc-1 또는 Alt-2를 누르면 shell-expand-line따옴표가 제거되지 않는다는 것 입니다.그리고프로세스/명령 대체가 수행됩니다. 꽤 직관적이지 않나요?

버그 보고서를 제출해 볼 수도 있지만 Bash에는 이미 유사한 제한 사항과 특수 사례가 수천 개 있을 수 있습니다.

관련 정보