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命令。
我也附上图片链接。
3条答案
按热度按时间ujv3wf0j1#
像
bash
这样的shell可以扩展通配符。像ls
和mkdir
这样的程序根本不处理通配符,它们依赖于shell进行通配符扩展。重要的是要理解通配符被扩展为 * 现有 * 文件的列表。
在您的示例中,
my*
扩展为mydir
,因为mydir
存在,但my*/abc
不会**扩展为mydir/abc
,因为没有名为mydir/abc
的文件。所以这个通配符按原样传递给mkdir
。然后mkdir
尝试创建一个名为my*/abc
的目录(名称中有星号,记住它不知道通配符),并且失败了,因为它需要一个名为my*
的目录已经存在,以便在它下面创建一个目录。n3h0vuf22#
shell在令牌级别上执行通配符扩展。
my*/nosuchfile
与现有文件不匹配,因此它的任何部分都不会被扩展。您似乎期望
my*
扩展为mydir
,* 并且它确实独立地扩展了;* 但是当作为一个较长的token的一部分时,整个token必须匹配某些内容,以便shell执行通配符扩展。qhhrdooz3#
在
mkdir my*/abc
中,shell在运行mkdir
之前尝试展开通配符globmy*/abc
,但没有匹配该模式的内容。您的shell显然被配置为,而不是报告错误或在这种情况下将其替换为空,只是将字符串作为单个参数传递(如果使用bash
,这意味着failglob
和nullglob
选项被关闭)。然后,由于目录my*
不存在,mkdir
自然会失败。