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

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

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

ls *

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

ls: invalid option -- '|'
Try 'ls --help' for more information.

尽管

ls

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

 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

关于为什么通配符在这里不起作用的任何想法?我在 Ubuntu 上,在终端中工作,我不知道这是否有什么不同。

谢谢。

答案1

当你跑步时

ls *

通配符照常生效,并且*扩展到当前目录中的所有文件名 - 包括这个:

-|h4k3r|-

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

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

ls ./*

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

ls -- *

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

答案2

我认为这里缺少的重要概念飞跃是完成通配符的地方。ls本身永远不会进行任何通配符操作。如果您不给它任何参数,它会假定您的意思.并列出该目录,就像您在命令行上提供的任何目录一样。

进行通配符操作的是 shell。然后 shell 将结果作为一堆命令行参数传递给ls.ls不知道您是否输入了这些参数,或者它们是否是全局扩展的结果。因此它会像解析任何其他命令行参数一样解析它们的标志。

这不是 Windows 上的工作方式,我认为这是 Windows 处理命令行程序的一个主要缺陷。

这里另一个有趣的演示是创建一个包含一堆目录的目录。如果您随后执行ls *此操作,shell 会将所有这些目录作为参数提供,并ls为您提供每个目录的列表。这只是表明假设.您没有提供参数是一个简单的默认行为,而不是任何特殊行为。

如果您说./*shell*会执行全局扩展,导致所有内容都位于./其前面,因此ls不会将任何参数解释为选项。如果这样做ls -- *ls则将该选项解释--为意味着它应该停止尝试处理选项并将所有其余参数视为应该列出的文件或目录。所以,恕我直言,--是更好的选择。

--绝大多数 Unix 命令行实用程序都遵循该约定,并且是为大多数语言编写的大多数参数解析库的标准功能。

答案3

通常该命令ls *应列出当前工作目录中的所有文件和目录。有 2 种情况会导致您面临的问题。

  1. 如果目录中包含的任何文件包含不支持的字符,例如名为--2“or”的目录,-2就会导致此类错误。例如:

    # ls -la | grep 2$
    drwxrwxr-x  2 test test    4096 Oct 28 14:58 --2
    # ls *
    ls: unrecognized option '--2'
    

    这是因为以 开头的文件名将-被视为ls命令的选项。

  2. 如果不是这种情况,我相信您的文件中可能设置了一些别名.bashrc。例如,如果我设置了别名alias ls='ls –2',我将无法使用该ls命令,因为它将调用无效选项-2

答案4

这意味着您有一个名为“-|”的文件。由于 shell(bash、ksh 等)的工作方式,所有通配符表达式都会根据当前目录中的内容进行评估该命令被调用,所以如果你有一个名为-|,然后ls *将被称为ls file1 file2 ... -| ...,并且您会收到此错误。

至于如何删除或重命名它 -例如,您可以将mv './-|' xyz其重命名为。xyz

相关内容