为什么Linux通配符(*)不适用于'mkdir'命令?

ia2d9nvy  于 2023-05-22  发布在  Linux
关注(0)|答案(3)|浏览(256)

Linux通配符()不适用于某些命令,如touch、mkdir,而我在相对路径中使用 *
当在命令中使用通配符(
)时,在某些地方它可以工作,但有时却不能。我在这里写代码,请帮我找出我的错误。
[trainee@esem-linux-jump ~]$ ls
联系我们
[trainee@esem-linux-jump ~]$ ls my*
list1 list2shell_code
[trainee@esem-linux-jump ~]$mkdirmy*/abc
mkdir:无法创建目录'my*/abc':没有这样的文件或目录
[trainee@esem-linux-jump ~]$rmdirmy*/shel*
[trainee@esem-linux-jump ~]$ls my*
联系我们

所以 * 可以使用ls,cd,rmdir,但不能使用mkdir命令。

我也附上图片链接。

ujv3wf0j

ujv3wf0j1#

bash这样的shell可以扩展通配符。像lsmkdir这样的程序根本不处理通配符,它们依赖于shell进行通配符扩展。
重要的是要理解通配符被扩展为 * 现有 * 文件的列表。
在您的示例中,my*扩展为mydir,因为mydir存在,但my*/abc不会**扩展为mydir/abc,因为没有名为mydir/abc的文件。所以这个通配符按原样传递给mkdir。然后mkdir尝试创建一个名为my*/abc的目录(名称中有星号,记住它不知道通配符),并且失败了,因为它需要一个名为my*的目录已经存在,以便在它下面创建一个目录。

n3h0vuf2

n3h0vuf22#

shell在令牌级别上执行通配符扩展。my*/nosuchfile与现有文件不匹配,因此它的任何部分都不会被扩展。
您似乎期望my*扩展为mydir,* 并且它确实独立地扩展了;* 但是当作为一个较长的token的一部分时,整个token必须匹配某些内容,以便shell执行通配符扩展。

qhhrdooz

qhhrdooz3#

mkdir my*/abc中,shell在运行mkdir之前尝试展开通配符glob my*/abc,但没有匹配该模式的内容。您的shell显然被配置为,而不是报告错误或在这种情况下将其替换为空,只是将字符串作为单个参数传递(如果使用bash,这意味着failglobnullglob选项被关闭)。然后,由于目录my*不存在,mkdir自然会失败。

相关问题