Bash 매뉴얼에 따르면 shell-expand-line
GNU 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에는 이미 유사한 제한 사항과 특수 사례가 수천 개 있을 수 있습니다.