为什么命令“ls *”会产生关于无效选项的错误?

Mae*_*lPJ 37 linux ls wildcards

有一个线程谈论ls "*"不显示任何文件,但我实际上想知道为什么简单

ls *
Run Code Online (Sandbox Code Playgroud)

命令除了在我的终端中不输出任何内容

ls: invalid option -- '|'
Try 'ls --help' for more information.
Run Code Online (Sandbox Code Playgroud)

尽管

ls
Run Code Online (Sandbox Code Playgroud)

将列出当前目录中的所有文件为

 1                  ferol                      readme.txt
 2                  fichier                    sarku
 2018               GameShell                  Templates
 22223333          '-|h4k3r|-'                 test
 3                  hs_err_pid2301.log         test2
 CA.txt             important.top.secret.txt   toto.text
 CA.zip             JavaBlueJProject           tp1_inf1070
 countryInfo.txt    liendur                   'tp1_inf1070_A19(2) (1)'
 currency           liensymbolique             tp1_inf1070_A19.tar
 curreny            LOL                        Videos
 Desktop            Longueuil                 'VirtualBox VMs'
 Documents          Music                      words
 douffos            numbers                    Zip.zip
 Downloads          Pictures
 examples.desktop   Public
Run Code Online (Sandbox Code Playgroud)

关于为什么通配不在这里生效的任何想法?我在 Ubuntu 上,在终端上工作,我不知道它是否有所作为。

谢谢。

Jig*_*aga 103

当你跑

ls *
Run Code Online (Sandbox Code Playgroud)

globbing 像往常一样生效,并且*扩展到当前目录中的所有文件名——包括这个:

-|h4k3r|-
Run Code Online (Sandbox Code Playgroud)

以 a 开头-,因此ls尝试将其解析为选项(如-a-l)。由于|实际上不是 识别的选项ls,它会抱怨错误消息invalid option,然后退出(不列出任何文件)。

如果要明确列出当前文件夹中的所有内容,请尝试

ls ./*
Run Code Online (Sandbox Code Playgroud)

...它将为所有文件名加上前缀./(这样条目不会被误解为一个选项),或者

ls -- *
Run Code Online (Sandbox Code Playgroud)

... --“指示选项结束的分隔符”在哪里,即。任何剩余的参数都是文件名。

  • @jwodder,添加引号无济于事。它们只在外壳中有意义。即使你写了 `ls'-|'`(带引号),`ls` 仍然会看到一个以破折号开头的参数,并抱怨它不是一个有效的选项。另一方面,如果您将实际引号传递给 `ls`,(就像在运行 `ls "'-|'"` 时一样),那么它会查找包含这些引号的文件名,并且可能会抱怨它没有'存在。 (13认同)
  • @ThomasWeller:引号不是文件名的一部分;它们只出现在 OP 的 `ls` 列表中,因为较新版本的 GNU ls 在输出中引用包含特殊字符的文件名。另一方面,如果您意识到这一点并建议在扩展 glob 时 shell *add* 引用,那将与几十年前的 Bourne-shell 风格背道而驰;如果 shell 程序员围绕它工作的时间比你活着的时间长,这不是一个错误。 (8认同)
  • @jwodder 从来没有 shell 程序员被迫处理这样的文件名。使用 `--` 来阻止实用程序将进一步的参数解析为选项是处理不被视为选项的未知参数的成熟方法。恕我直言,这不是黑客攻击或解决方法,只是普通的防御性编程。 (7认同)
  • @rexkogitans :“有一个线程谈论 ls "*" 不显示任何文件”说已经有一个线程解释了这一点,在这里这样做是多余的。 (3认同)
  • @jwodder:好吧,那么错误是第一次被报告为错误时没有人修复它。好吧,从现在开始,我会将 `-rf` 文件放到我找到的每个 Linux 系统上:-) (3认同)
  • 这不是错误,期间。这是 shell 对普通常见用例使用尽可能少的语法的结果。 (3认同)
  • @chepner,“ls *” shell 代码有一个错误。正确的语法是 `ls -- *` 或者可能是 `ls -d -- *` 甚至是 `printf '%s\n' *` 因为 OP 可能只想列出与模式匹配的文件而不是列出与模式匹配的目录的内容。 (2认同)