为什么文件扩展可以用于带有换行符的文件名?

为什么文件扩展可以用于带有换行符的文件名?
$ 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*
$

在第一个中rm,我使用 bash 中的自动完成功能来指定文件名中包含换行符的文件,但由于换行符,它不起作用。

在第二个中rm,我使用文件扩展来避免显式指定新行字符。为什么文件扩展可以避免这个问题呢?文件扩展不会扩展为也包含换行符的完整文件名吗?

答案1

对于以 \n, 结尾的文件的 rm rm file*,正则表达式文件扩展“吃掉”新行作为 rm 参数的一部分,因此 shell 不会看到它,也不会将其解析为命令。

正如 strace 中所见:

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

至于自动完成遵循一组预定义的规则,并且它并不真正期望那里有一个 '\n' 。

相关内容