【问题标题】:ln has unexpected behavior when using a wildcardln 使用通配符时出现意外行为
【发布时间】:2012-08-20 04:34:26
【问题描述】:

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

我最近运行了一个类似这样的 bash 命令:

ln -s ../../avatars/* ./

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

ln -s "../../avatars/*" ./

因为这是处理此类文件名的正确方法。

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

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

有些人甚至会说在符号链接中使用通配符是不好的做法。但是,我确切地知道目录的内容,这比手动手动执行每个文件要快得多。

【问题讨论】:

  • 此行为与 ln 或 coreutils 无关。

标签: linux bash ln gnu-coreutils


【解决方案1】:

这不是错误。

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

echo *.c

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

对于许多命令,如果您指定不存在的文件,则会出现错误,并且您会收到一条看似有意义的消息,例如“无法访问 *.c”。但是对于ln -s,由于是符号链接,所以实际文件不一定存在,它会继续做链接。

【讨论】:

  • 是的,这种行为实际上是 POSIX 强制要求的:pubs.opengroup.org/onlinepubs/9699919799/utilities/…
  • 感谢您对此的澄清。我以前从来没有遇到过这个。我通常使用制表符完成所有内容,但是当我这样做时,我创建了一个新目录,进入该目录,并使用我的 bash 历史记录运行该命令,该命令显然不再指向正确的相对目录。经验教训。
  • 虽然不是在 every shell 中。例如。 zsh 具有可配置性,默认情况下会为不匹配的模式打印错误。
  • 也可以使用 bash,只需在 ~/.bashrc 中添加 shopt -s failglob
猜你喜欢
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 2021-09-28
  • 1970-01-01
  • 2016-05-24
相关资源
最近更新 更多