줄 바꿈이 있는 파일 이름에 파일 확장자를 사용할 수 있는 이유는 무엇입니까?

줄 바꿈이 있는 파일 이름에 파일 확장자를 사용할 수 있는 이유는 무엇입니까?
$ rm Think\ Python:\ How\ to\ Think\ Like\ a\ Computer
\ Scientist\ 2014.pdf 
rm: cannot remove ‘Think Python: How to Think Like a Computer’: No such file or directory
$  Scientist 2014.pdf: command not found
$ rm Think*
$

첫 번째에서는 rmbash에서 자동 완성을 사용하여 이름에 개행 문자가 포함된 파일을 지정했지만 개행 문자 때문에 작동하지 않았습니다.

두 번째에서는 rm개행 문자를 명시적으로 지정하지 않기 위해 파일 확장자를 사용했습니다. 파일 확장자가 이 문제를 피할 수 있는 이유는 무엇입니까? 파일 확장자가 개행 문자도 포함하는 전체 파일 이름으로 확장되지 않습니까?

답변1

\n으로 끝나는 파일의 rm의 경우 rm file*정규식 파일 확장은 rm 인수의 일부로 개행을 "먹기" 때문에 쉘은 이를 보지 못하고 명령으로 구문 분석하지 않습니다.

strace에서 볼 수 있듯이:

$strace rm teste.txt* 
execve("/bin/rm", ["rm", "teste.txt\n"],

미리 정의된 규칙 집합을 따르는 자동 완성의 경우 실제로 '\n'이 필요하지 않습니다.

관련 정보