Linux ln在使用通配符时有意外行为

Linux ln在使用通配符时有意外行为,linux,bash,ln,gnu-coreutils,Linux,Bash,Ln,Gnu Coreutils,我正计划为此在coreutils上提交一个bug,因为这种行为出乎意料,在现实世界中没有任何实际用途。。。虽然一开始它确实让我发笑,因为我甚至不知道有人可以创建文件名中带有通配符的文件。带有通配符的文件名有多实用?谁会使用这样的功能 我最近运行了一个与此类似的bash命令: ln -s ../../avatars/* ./ 不幸的是,我没有添加正确数量的“./”,因此它没有向我提供信息性错误,只是创建了一个指向不存在的“*”文件的链接。我希望这样做: ln -s "../../avatars/

我正计划为此在coreutils上提交一个bug,因为这种行为出乎意料,在现实世界中没有任何实际用途。。。虽然一开始它确实让我发笑,因为我甚至不知道有人可以创建文件名中带有通配符的文件。带有通配符的文件名有多实用?谁会使用这样的功能

我最近运行了一个与此类似的bash命令:

ln -s ../../avatars/* ./
不幸的是,我没有添加正确数量的“./”,因此它没有向我提供信息性错误,只是创建了一个指向不存在的“*”文件的链接。我希望这样做:

ln -s "../../avatars/*" ./
因为这是处理此类文件名的正确方法

在提交关于coreutils的bug之前,我想听听其他人的意见。这种行为是否有实际用途,或者ln是否应该提供有意义的错误消息

是的,我知道可以链接到整个目录,而不是其中的每个文件,但我不希望新创建的文件复制到旧位置。那里只有几个文件正在链接

有些人甚至可能会说,在符号链接中使用通配符是一种糟糕的做法。但是,我确切地知道目录的内容,这比手动处理每个文件要快得多。

这不是一个bug

在shell中,如果使用的通配符模式与任何内容都不匹配,则不会替换该模式。例如,如果您这样做:

echo *.c
如果当前目录中没有.c文件,它将只打印“*.c”。如果当前目录中有.c文件,则*.c将替换为该列表

对于许多命令,如果您指定不存在的文件,这是一个错误,并且您会收到一条似乎有意义的消息,如“cannotaccess*.c”。但是对于ln-s,因为它是一个符号链接,所以实际的文件不必存在,它会继续创建链接。

这不是一个bug

在shell中,如果使用的通配符模式与任何内容都不匹配,则不会替换该模式。例如,如果您这样做:

echo *.c
如果当前目录中没有.c文件,它将只打印“*.c”。如果当前目录中有.c文件,则*.c将替换为该列表


对于许多命令,如果您指定不存在的文件,这是一个错误,并且您会收到一条似乎有意义的消息,如“cannotaccess*.c”。但是对于ln-s,因为它是一个符号链接,所以实际的文件不必存在,它会继续进行并创建链接。

是的,这个行为实际上是由POSIX强制执行的:感谢您对此的澄清。我以前从未遇到过这种情况。我通常会用tab完成所有操作,但当我这样做时,我创建了一个新目录,输入了该目录,并使用bash历史运行了该命令,该命令显然不再指向正确的相对目录。吸取的教训。虽然不是在每一个贝壳里。zsh是可配置的,默认情况下会为不匹配的模式打印错误。对于bash,只需在~/.bashrcYes中添加
shopt-s failglob
,这个行为实际上是由POSIX强制执行的:感谢您对此的澄清。我以前从未遇到过这种情况。我通常会用tab完成所有操作,但当我这样做时,我创建了一个新目录,输入了该目录,并使用bash历史运行了该命令,该命令显然不再指向正确的相对目录。吸取的教训。虽然不是在每一个贝壳里。例如,zsh具有可配置性,并且默认情况下会为不匹配的模式打印错误。对于bash,只需在~/.中添加
shopt-s failglob
。Bashrc此行为与ln或coreutils无关。此行为与ln或coreutils无关。