bash 不确定地处理星号通配符

bash 不确定地处理星号通配符

我无意中将一个没有主目录的用户添加到我的系统中(我忘记在 useradd 中输入 -d 和 -m 标志)。我没有删除用户并重新开始,而是尝试简单地创建主目录并从 /etc/skel 中自己复制文件。但是,我收到了以下奇怪的错误:

user@host:~$ sudo cp -rv /etc/skel/* /home/newuser/
cp: cannot stat `/etc/skel/*': No such file or directory

但是,以下两个命令可以按预期工作:

user@host:~$ sudo cp -rv /etc/skel/.bashrc /home/newuser/
user@host:~$ cp -rv ~/testfolder1/* /testfolder2/

有人能解释一下我为什么收到那个初始错误吗?

答案1

/etc/skel 目录通常只包含隐藏文件,即名称以句点开头的文件。*除非设置了选项,否则 shell 扩展的 不会包含隐藏文件。对于 bash,此选项用 来设置shopt -s dotglob

在您的情况下/etc/skel/*没有扩展为任何东西,所以 shell 将参数保留为/etc/skel/*,但没有该名称的文件。

答案2

当 glob 表达式 ( /etc/skel/*) 扩展为文件,则默认情况下,表达式在命令中以纯字符串形式保留。在这种情况下,它会扩展为无文件,因为 /etc/skel 中的所有文件都是点文件。因此,您试图复制 /etc/skel 中的文字文件“*”,但该文件不存在。

http://www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion

相关内容